<<
|
空位补0,被移除的高位丢弃
|
>>
|
被一簇的二进制最高位是0,右移后,空缺位补0
|
>>>
|
被移除二进制最高位无论是0或者是1,空缺位都用0补
|
&
|
任何二进制和0进行&运算,结果是0;和1进行&运算结果是原值
|
|
|
任何二进制和0进行|运算,结果为原值,和1进行运算结果为1
|
^
|
任何相同二进制进行^运算,结果为0;不相同二进制^运算结果为1
|
/**
* <<:左移-左边高位丢弃,右边空位补齐0
* >>:右移-最高位是0,左边补0,最高位是1,左边补1
* >>>:无符号右移-无论最高位是0还是1,左边补齐0
* @author wangjg
*
*/
public class OperatorDemo1 {
public static void main(String[] args) {
// TODO Auto-generated method stub
// << 左移
System.out.println(3 << 2);
// 正数右移
System.out.println(24 >> 3);
// 正数无符号右移
System.out.println(24 >>> 3);
// 负数右移
System.out.println(-24 >> 2);
// 负数无符号右移
System.out.println(-24 >>> 2);
}
/**
* 一、左移
* 3 << 2
* 首先计算3的二进制:
* 此数值是正数,原反补都一样,内存操作补码;
* 向左移动两位,最高位丢弃即括号中值丢弃,右边空位补齐0即末尾需要补齐两个0;
* 根据8421码得出的结果是12
* 00000000 00000000 00000000 00000011
* (00)000000 00000000 00000000 0000001100
*
* << 结论:把<<左边的数据*2的移动次幂,
* 3<<2等于3*2^2= 3*4 = 12
* 3<<3等于3*2^3= 3*8 = 24
*
*
* 二、正数右移和无符号右移
* 24 >> 3
* 24 >>> 3
* >>
* >>>
* 结论:在正数的情况下,右移和无符号右移均是把符号左边的数据除以2的移动次幂
* 24 >> 3 = 24 / 2 ^ 3 = 24 / 8 = 3
*
* 三、负数右移
* -24 >> 2
* 首先计算出24的二进制为:11000
* 00000000 00000000 00000000 00011000
* 由于是负数,最高位符号位为1
* 10000000 00000000 00000000 00011000
* 得到的数据是源码,内存中操作的是补码;
* 根据原码通过反码求补码
* (1) 原码转反码,符号位不变,其他为取反
* (2) 根据反码求补码,符号位不变,末位加1
* 原码:10000000 00000000 00000000 00011000
* 反码:11111111 11111111 11111111 11100111
* 补码:11111111 11111111 11111111 11101000
*
* 开始右移2位,第二行括号中的值丢弃,最高位是0就0补,是1就1补
* 内存中-24的值为
* 11111111 11111111 11111111 11101000
* 11111111 11111111 11111111 11111010(00)
* 右移成功后值为补码,需要转成原码
*
* (1)根据补码转反码,符号位不变,末位减一
* (2)根据反码转原码,符号位不变,其他取反
* 补码:11111111 11111111 11111111 11111010
* 反码: 11111111 11111111 11111111 11111001
* 原码:10000000 00000000 00000000 00000110
*
* 得出最后的值为:-6
*
*
* 四、负数无符号右移
* -24 >>> 2
* 首先计算出24的二进制为:11000
* 00000000 00000000 00000000 00011000
* 由于是负数,最高位符号位为1
* 10000000 00000000 00000000 00011000
* 得到的数据是源码,内存中操作的是补码;
* 根据原码通过反码求补码
* (1) 原码转反码,符号位不变,其他为取反
* (2) 根据反码求补码,符号位不变,末位加1
* 原码:10000000 00000000 00000000 00011000
* 反码:11111111 11111111 11111111 11100111
* 补码:11111111 11111111 11111111 11101000
*
* 开始右移2位,第二行括号中的值丢弃,无论最高位是0或1,均补0
* * 内存中-24的值为
* 11111111 11111111 11111111 11101000
* 00111111 11111111 11111111 11111010(00)
*
* 值最高为0,为正数,原反补都一样,最终的值为:1073741818
*
*/
}
常见位运算面试题:
请使用最有效率的方式写出2乘以8的结果?
最有效的是位运算 2 << 3 = 2 * 2 ^3 = 2 * 8 = 16