java运算符与&、非~、或|、异或^ ,补码,源码,反码

  • 位与运算符(&)
    运算规则:两个数都转为二进制,然后从高位开始比较,高位不足补0,如果两个数都为1则为1,否则为0。
    例子:

      6的二进制为110,1的十进制为1 , 6 & 1 = 0
      110
      001
      -------
      000 	 =>	转换成10进制得0;
      
      10的二进制为1010, 6 & 10 = 2
      0110
      1010
      ---------
      0010   => 转换成10进制得2;
    
  • 位或运算符(|)
    运算规则:两个数都转为二进制,然后从高位开始比较,两个数只要有一个为1则为1,否则就为0。
    例子参考位与运算符(&)

  • 位异或运算(^)
    运算规则是:两个数转为二进制,然后从高位开始比较,如果相同则为0,不相同则为1。
    例子参考位与运算符(&)

  • 位非运算符(~)
    运算规则:如果位为0,结果是1,如果位为1,结果是0.
    在Java中,所有数据的表示方法都是以补码的形式表示,如果没有特殊说明,Java中的 数据类型默认是int,int数据类型的长度是8位,一位是四个字节,就是32字节,32bit.
    比如:~37

	37转为二进制是100101.
	
	补码后为: 00000000 00000000 00000000 00100101
	
	取反为:   11111111 11111111 11111111 11011010
	
	因为高位是1,所以原码为负数,负数的补码是其绝对值的原码取反,末尾再加1。
	
	因此,我们可将这个二进制数的补码进行还原: 首先,
	末尾减1得反码:11111111 11111111 11111111 11011001 ,
	其次,将各位取反得原码:00000000 00000000 00000000 00100110,
	此时二进制转原码为38
	所以~37 = -38.
  • 原码
    一个正数,转换为二进制位就是这个正数的原码。
    负数的绝对值转换成二进制位然后在高位补1就是这个负数的原码

  • 反码
    正数的反码就是原码,
    负数的反码等于原码除符号位以外所有的位取反

  • 补码
    正数的补码与原码相同,
    负数的补码为 其原码除符号位外所有位取反(得到反码了),然后最低位加1.

参考来自

猜你喜欢

转载自blog.csdn.net/bb23417274/article/details/87896473