java:4-11位运算、原码反码补码

文章目录

  • 1.位运算
    • [1.1 7个位运算符【记】](#1.1 7个位运算符【记】)
    • [1.2 案例](#1.2 案例)
  • [2. 二进制在运算中的说明](#2. 二进制在运算中的说明)
  • [3. 原码反码补码](#3. 原码反码补码)
    • [3.1 八个原则【背】](#3.1 八个原则【背】)

1.位运算

1.1 7个位运算符【记】

  • java 中有 7 个位运算(&、|、^、~、>>、<<和 >>>)
    1. 按位与& : 两位全为1,结果为1,否则为0
      【两个数字同一个位子上都为1,则为1,否则为0】
    2. 按位或|: 两位有一个为1,结果为1,否则为0
    3. 按位异或^ : 两位一个为0,一个为1,结果为1,否则为0
      【2个数不同就是1,一样就是0】
    4. 按位取反~: 0->1,1->0
    5. 算术右移 >> : 符号位不变, 低位溢出,并用符号位补溢出的高位
    6. 算术左移 <<: 符号位不变, 低位补 0
    7. >>>逻辑右移:也叫无符号右移,运算规则是: 低位溢出,高位补 0

1.2 案例

  1. 2&3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		//1. 获得2的补码(计算机都使用补码运算)需要先知道2的原码。2是int为4个字节
		//2的原码为 00000000 00000000 00000000 00000010
		//2的补码为00000000 00000000 00000000 00000010(正数三码合一)
		
		//2. 获得3的补码。知3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011
		
		//3. 按位于&
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000010(按位于的计算结果)
		
		//4. 转为原码
		//结果的补码第一位(符号为为0,是正数)
		//原码与补码一致
		//00000000 00000000 00000000 00000010 = 2
		System.out.println(2&3); //输出2
	}
} 
  1. ~ -2
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到-2的原码10000000 00000000 00000000 00000010
		//-2反码11111111 11111111 11111111 11111101
		//-2补码11111111 11111111 11111111 11111110

		//2. 按位取反
		//~-2补码:00000000 00000000 00000000 00000001
		//~-2转为原码,结果为1(正数3码合一)
		System.out.println(~-2); //输出1
	}
} 
  1. ~ 2
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 按位取反
		//~2补码:11111111 11111111 11111111 11111101
		//~2反码:11111111 11111111 11111111 11111100
		//~2原码:10000000 00000000 00000000 00000011(除了符号位,其他互换)
		//~2 = -3

		System.out.println(~2); //输出-3
	}
} 
  1. 2|3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011

		//按位或
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000011(结果的补码)
		//结果为3
		System.out.println(2|3); //输出3
	}
} 
  1. 2^3
java 复制代码
public class var01 {

	//编写一个main方法
	public static void main(String[] args) {
		//推导过程
		// 1. 得到2的原码00000000 00000000 00000000 00000010
		//2的补码00000000 00000000 00000000 00000010(正数三码合一)

		//2. 3的原码为00000000 00000000 00000000 00000011
		//3的补码为00000000 00000000 00000000 00000011

		//按位异或
		//00000000 00000000 00000000 00000010
		//00000000 00000000 00000000 00000011
		//00000000 00000000 00000000 00000001(结果的补码)
		//结果为1
		System.out.println(2^3); //输出1
	}
} 
  1. int a=1>>2;
    1 => 00000000 00000000 00000000 00000001
    => 00000000 00000000 00000000 00000000
    【本质:算术右移1位 = 除1次2。ex. 1 / 2 / 2 =0】
  2. intc=1<<2;
    1 => 00000000 00000000 00000000 00000001
    =>00000000 00000000 00000000 00000100
    【本质:算术左移1位 = 乘1次2。ex. 122=4】
  3. 额外练习
    • ~2=? // 按位取反
    • 2&3=? // 2 按位与3
    • 2|3=?
    • ~-5=?
    • 13&7=?
    • 5|4=?
    • -3^3=? //^ 按位异或

2. 二进制在运算中的说明

  1. 二进制是逢2进位的进位制,0、1是基本算符。
  2. 现代的电子计算机技术全部采用的是二进制,因为它只使用0、1两个数字符号。非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。二进制 (Binary)数用0和1两个数字及其组合来表示任何数。进位规则是"逢2进1",数字1在不同的位上代表不同的值,按从右至左的次序,值以二倍递增。

3. 原码反码补码

3.1 八个原则【背】

  1. 二进制的最左位是符号位 :0表示正数,1表示负数(老韩口诀:0->0 1->-
  2. 正数 的原码,反码,补码都一样(三码合一
  3. 负数的反码=它的原码符号位不变,其它位取反(0->1,1->0)
  4. 负数的补码 = 它的反码+1,负数的反码 = 负数的补码-1
  5. 0的反码,补码都是0
  6. java没有无符号数,换言之,java中的数都是有符号的
  7. 计算机是以补码的方式来运算的.
  8. 当我们看运算结果 的时候,要看他的原码(重点)
相关推荐
blammmp9 分钟前
Java:数据结构-枚举
java·开发语言·数据结构
何曾参静谧22 分钟前
「C/C++」C/C++ 指针篇 之 指针运算
c语言·开发语言·c++
暗黑起源喵27 分钟前
设计模式-工厂设计模式
java·开发语言·设计模式
鸭鸭梨吖31 分钟前
产品经理笔记
笔记·产品经理
WaaTong32 分钟前
Java反射
java·开发语言·反射
Troc_wangpeng33 分钟前
R language 关于二维平面直角坐标系的制作
开发语言·机器学习
努力的家伙是不讨厌的35 分钟前
解析json导出csv或者直接入库
开发语言·python·json
Envyᥫᩣ1 小时前
C#语言:从入门到精通
开发语言·c#
齐 飞1 小时前
MongoDB笔记01-概念与安装
前端·数据库·笔记·后端·mongodb
九圣残炎1 小时前
【从零开始的LeetCode-算法】1456. 定长子串中元音的最大数目
java·算法·leetcode