位运算符有以下
位运算都是基于补码的运算,我先讲一下原码<注位:运算是操作做整数的>
(一下代码有些排版问题,不太整齐,多多见谅)
原码其实就是二进制的表现形式 如 int v1 = 5;
注:第一位的0代表正数,1代表负数,因为int是4字节1字节是8比特(bit)所以是32位,为了表示我把符号位单独隔开
原码 0 0000000 00000000 00000000 00000101
反码 0 0000000 00000000 00000000 00000101
补码 0 0000000 00000000 00000000 00000101
正数的原,反,补都是一样的.主要侧重是负数 下面是 int v2 = -6;
原码 1 0000000 00000000 00000000 00000110
反码 1 1111111 11111111 11111111 11111001 (原码,符号位不变,其余取反)
补码 1 1111111 11111111 11111111 11111010 (反码+1)
所以可以看出不同,负数的反码是符号位不变,其余取反,补码是反码+1.然后下面我一个一个简绍为运算符
& 按位与
偷一下懒,我就那上面的例子使用
int v1 = 5;
int v2 = -6;
(v1的)补码 0 0000000 00000000 00000000 00000101
(v2的)补码 1 1111111 11111111 11111111 11111010
结果 0 0000000 00000000 00000000 00000000
System.out.println(v1&v2);//输出结果为0
&就是判断对照位的是否都是1,如果都为1则得到新的数的该位为1,
否则为0,和逻辑运算一样 0是false,1是true
注:运算得到的结果是补码,如果是正数可以直接算出十进制得到结果
如果是负数还需逆推得到原码在转十进制
| 按位或
还是拿上面例子
v1的补码 0 0000000 00000000 00000000 00000101
v2的补码 1 1111111 11111111 11111111 11111010
运算结果 1 1111111 11111111 11111111 11111111
逆推反码 1 1111111 11111111 11111111 11111110 (反码等补码-1)
逆推原码 (-1) 1 0000000 00000000 00000000 00000001 (原码等反码符号位不变,其余取反)
可以得到以上结果但是由于是补码所以需要逆推
System.out.println(v1|v2);//得到结果-1
^ 按位异或
v1的补码 0 0000000 00000000 00000000 00000101
v2的补码 1 1111111 11111111 11111111 11111010
结果 1 1111111 11111111 11111111 11111111
逆推原码 1 0000000 00000000 00000000 00000001
^只要同为的不相同就为1(true)
System.out.println(v1^v2);//结果-1
~ 取反
这个运算结果就是将补码取反得到新的补码
v1的补码 0 0000000 00000000 00000000 00000101
新补码 1 1111111 11111111 11111111 11111010
逆推得到原码 0 0000000 00000000 00000000 00000110
System.out.println(~v1);//结果-6
\>>右位移
v1的补码 0 0000000 00000000 00000000 00000101
v1位移后 0 0000000 00000000 00000000 00000010|1
System.out.println(v1>>1);//结果为2
可以看出,位运算就是符号位不变,向右移位,然后把多余的去掉,可以理解成除2的(位移次方)
v2的补码 1 1111111 11111111 11111111 11111010
System.out.println(v2>>31);//注:负数补的是1,正数补得的0
v2位移后 1 1111111 11111111 11111111 11111111
原码 1 0000000 00000000 00000000 00000001
System.out.println(v2>>31);//注:因为反码= 补码-1,所以负数位移最小结果为-1,不是0
<< 左位移
略过,和右位移一样
\>>>无符号位移
这个位移和左位移右位移,相似,唯一的不同就是这个位移会把符号位运算,
所以下面我拿负数举例(不举正数了)
System.out.println(v2>>>5);//结果134217727
此处符号位也运算,故此不和上面的例子一样分离符号位了
v2的补码 11111111 11111111 11111111 11111010
v2位移后 00000111 11111111 11111111 11111111|11010
原码结果
以上这个>>>(无符号位移是我自己的主观理解)
大家可以参考下,想要了解可以百度下其他的
以上是我个人的见解,初学半年,理解难免有不足之处,希望大家能够提出意见让我改成,若对你有所帮助,希望可以点下赞ヾ(≧▽≦*)o