位运算符和位移运算符是底层运算符,处理组成整数的单个位。位运算符和位移运算符操作数不能是浮点数、布尔值、数组或对象。如果操作数是布尔值,&、| 和 ^ 运算符执行的是逻辑运算。
如果位运算符的操作数中有一个是 long 类型,结果就是 long 类型。除此之外,结果都是 int 类型。如果位移运算符左边的操作数是 long 类型,结果为 long 类型;否则,结果是 int 类型。位运算符和位移运算符如下。
按位补码(~)
一元运算符 ~ 是按位补码运算符,或叫位非运算符。它把单个操作数的每一位反相,1 变成 0,0 变成 1。
byte b = ~12; // ~00001100 ==> 11110011或十进制数-13
位与(&)
这个运算符在两个整数操作数的每一位上执行逻辑与运算,合并这两个操作数。只有两个操作数的同一位都为 1 时,结果中对应的位才是 1。
10 & 7 // 00001010 & 00000111 ==> 00000010或2
位或(|)
这个运算符在两个整数操作数的每一位上执行逻辑或运算,合并这两个操作数。如果两个操作数的同一位中有一个或两个都是 1,结果中对应的位是 1;如果两个操作数的同一位都是 0,结果中对应的位是 0。
10 | 7 // 00001010 | 00000111 ==> 00001111或15
位异或(^)
这个运算符在两个整数操作数的每一位上执行逻辑异或运算,合并这两个操作数。如果两个操作数的同一位值不同,结果中对应的位是 1;如果两个操作数的同一位都是 1 或 都是 0,结果中对应的位是 0。
10 ^ 7 // 00001010 ^ 00000111 ==> 00001101或13
左移(<<)
<< 运算符把左侧操作数的每一位向左移动右侧操作数指定的位数。左侧操作数的高位被丢掉,右边缺少的位补零。整数向左移 n 位,相当于乘于 2n。
10 << 1 // 00001010 << 1 = 00010100 = 20 = 10*2
7 << 3 // 00000111 << 3 = 00111000 = 56 = 7*8
-1 << 2 // 0xFFFFFFFF << 2 = 0xFFFFFFFC = -4 = -1*4
带符号右移(>>)
>> 运算符把左侧操作数的每一位向右移动右侧操作数指定的位数。左侧操作符的低位被移除,移入的高位和原来的最高位一样。也就是说,如果左侧操作数是正数,移入的高位是 0;如果左侧操作数是负数,移入的高位是 1。这种技术叫高位补符号,作用是保留左侧操作数的符号。如果左侧操作数是正数,右侧操作数是 n,>> 运算符的计算结果相当于整数除以 2n。
10 >> 1 // 00001010 >> 1 = 00000101 = 5 = 10/2
27 >> 3 // 00011011 >> 3 = 00000011 = 3 = 27/8
-50 >> 2 // 11001110 >> 2 = 11110011 = -13 != -50/4
不带符号右移(>>>)
这个运算符和 >> 类似,但是不管左侧操作数的符号是什么,高位总是移入 0。这种技术叫高位补零。左侧操作数是无符号的数字时才适用这个运算符(可是 Java 的整数类型都带符号)。
0xff >>> 4 // 11111111 >>> 4 = 00001111 = 15 = 255/16
-50 >>> 2 // 0xFFFFFFCE >>> 2 = 0x3FFFFFF3 = 1073741811
标签:10,操作数,Java01,一位,运算符,左侧,位移
From: https://www.cnblogs.com/zhuanghamiao/p/Java-01.html