「景哥java」搞懂java的运算符
^ 是一种位运算符,叫“异或”,运算逻辑是:相同为0,不同为1。
举例:0^1 = 1,1^1 = 0
位运算符还有:与&、或 |、非 ~
与&:a & b 时,只有a、b都为1,结果才是1,否则结果为0。
或 | :a | b 时,a、b只要有一个为1,那么结果就是1,否则为0。
非 ~ :~a 时,a为0则结果是1;a为1则结果是0。
原码:最左边一位表示这个数的正负,0代表正,1代表负,后面是它的有效数字。
反码:最左边符号位0代表正,1代表负;后面的有效数字,正数的原码和反码一样,负数的反码是原码数字的取反。
补码:最左边符号位0代表正,1代表负;后面的有效数字,正数的补码和原码一样,负数的补码是反码+1。
>> 是右移运算符,num >> 1,相当于num除以2
20的二进制是10100,20 >> 1,结果是01010,即10。
与之对比的是 << 左移操作符, num << 1,相当于num乘以2。
20<<1,结果是101000,即40。
>>> 是无符号右移操作符,对于正数而言,>> 和 >>> 效果一样;对负数而言,先要计算其补码,再右移,高位补0。
负数的无符号右移要复杂一些,因为负数在内存中是以补码的形式存在:
-2原码:10000000 00000000 00000000 00000010
-2反码:11111111 11111111 11111111 11111101
-2补码:11111111 11111111 11111111 11111110
11111111 11111111 11111111 11111110 >>>1 即 01111111 11111111 11111111 11111111
所以,-2 >>> 1的结果并不是 -1 或 1 [捂脸],而是 2147483647 !
与之对应的是无符号左移操作符 <<< 。
如果能给您带来帮助,欢迎关注、收藏 [谢谢]
C语言之移位运算符
<< //左移运算符
左移运算符将其运算对象每一位的值都向左移动。(左移几位,右边末尾就补几个0)
char a = 1;// (0000 0001)
b = a <<3; // (0000 0001 000 ),1字节是8位,因为是左移,所以要把最右边的去掉3位;
(0 0001 000)就是b变量的值(8)
>> //右移运算符
右移的话有点麻烦,因为带符号类型的话(0010 0011)值是35,如果往右移2位的话
变成(1000 1100)也不知道代表的是负数还是正数(每个机器显示的都不一样);
总之右移尽量不要用在有符号类型,不安全!!
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。