Java

二进制数字各种运算!<<<、 >>> 、|=、&、^区别

2021-01-09  本文已影响0人  乘风破浪丶文鑫
A = 0011 1100
B = 0000 1101
-----------------
A&B = 0000 1100
A | B = 0011 1101
A ^ B = 0011 0001
~A= 1100 0011

(A&B),得到12,即0000 1100
按位与运算符(&): 如果相对应位都是1,则结果为1,否则为0;

(A | B)得到61,即 0011 1101
按位或运算符(|): 如果相对应位都是0,则结果为0,否则为1;

(A ^ B)得到49,即 0011 0001
异或运算符(^): 如果相对应位值相同,则结果为0,否则为1;

(〜A)得到-61,即1100 0011
按位取反运算符(〜): 翻转操作数的每一位,即0变成1,1变成0;

A << 2得到240,即 1111 0000
按位左移运算符(<<): 左操作数按位左移右操作数指定的位数。

A >> 2得到15即 1111
按位右移运算符(>>): 左操作数按位右移右操作数指定的位数。

A>>>2得到15即0000 1111
按位右移补零操作符(>>>): 左操作数的值按右操作数指定的位数右移,移动得到的空位以零填充。

二进制数左数第一位(即最高位):
0表示正数,用1表示负数,

负数通常不用原码表示,而是用补码来表示原码
负数原码的补码是原码的符号位不变,其余位按位取反再加1所得

原码与补码转换

两个说法bai都没有错,du我们举个例子来看看就明zhi白了:dao
1、10001的补码是取反zhuan后在再加1,也就是11110+1=11111;shu
2、如果是11111变回原码呢?我们可以采取逆过程先减1,11111-1=11110,再取反变为10001;
3、如果要是在补码变原码时先去反再加一呢?(就是问题中的说法)结果为11111先取反为10000,再加1,10000+1=10001。这个结果与2是一样的,并且也是和1中的原码相吻合。
通过上述例子可以看出,无论是原码变补码还是补码变原码,都可以采取先取反再加1的方法。至于原因是很容易想通的。
按照正常思维来想的话,补码变成原码应该是原码变补码的逆过程,也就是2步中的方法。但是我们可以思考一下,如果我们没有按照2步中的方法而是先去取反了呢?先取反得到的结果和2步的结果有什么差异呢?答案是差了1,2步中是先减1才取的反,而直接取反的话,就没有减1。
接着请注意,在取反前减1和在取反后加1的效果是一样的。这就和-3-1=-(3+1)是一个道理。
所以问题中的说法没有错误。

<< 表示左移移,不分正负数,低位补0; 

左移时不管正负,低位补0
正数:r = 20 << 2
  20的二进制补码:0001 0100
  向左移动两位后:0101 0000
         结果:r = 80
负数:r = -20 << 2
  -20 的二进制原码 :1001 0100
  -20 的二进制反码 :1110 1011
  -20 的二进制补码 :1110 1100
  左移两位后的补码:1011 0000
        反码:1010 1111
        原码:1101 0000 
        结果:r = -80

>> 表示右移,如果该数为正,则高位补0,若为负数,则高位补1;

注:以下数据类型默认为byte-8位
正数:r = 20 >> 2
  20的二进制补码:0001 0100
  向右移动两位后:0000 0101
       结果:r = 5
负数:r = -20 >> 2
  -20 的二进制原码 :1001 0100
  -20 的二进制反码 :1110 1011
  -20 的二进制补码 :1110 1100 
  右移两位后的补码:1111 1011 
        反码:1111 1010
        原码:1000 0101
        结果:r = -5

>>> 表示无符号右移,也叫逻辑右移,即若该数为正,则高位补0,而若该数为负数,则右移后高位同样补0

正数: r = 20 >>> 2
    的结果与 r = 20 >> 2 相同;
负数: r = -20 >>> 2
注:以下数据类型默认为int 32位
  -20:源码:10000000 00000000 00000000 00010100
    反码:11111111  11111111   11111111   11101011
    补码:11111111  11111111   11111111   11101100
    右移:00111111  11111111   11111111   11111011
    结果:r = 1073741819
上一篇 下一篇

猜你喜欢

热点阅读