位运算与相关常见面试题

<<
空位补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



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值