java自学笔记:位运算、原码反码补码

2023-12-26 06:16:32

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
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
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
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
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(23); //输出3
	}
} 
  1. 2^3
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. 当我们看运算结果的时候,要看他的原码(重点)

文章来源:https://blog.csdn.net/skylar0/article/details/135208066
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。