Java位运算总结(LeetCode里常用)

Java位运算是针对于整型数据类型的二进制进行的移位操作。主要包括位与、位或、位非,有符号左移、有符号右移,无符号右移等等

在计算机系统中,数值一律用补码来表示和存储。原因在于,使用补码,可以将符号位和数值域统一处理;同时,加法和减法也可以统一处理。此外,补码与原码相互转换,其运算过程是相同的,不需要额外的硬件电路。

    1.求负整数的补码,将其对应正数二进制表示所有位取反(包括符号位,0变1,1变0)后加1

数0的补码表示是唯一的

    2.转化为原码
已知一个数的补码,求原码的操作其实就是对该补码再求补码:
⑴如果补码的符号位为“0”,表示是一个正数,其原码就是补码。
⑵如果补码的符号位为“1”,表示是一个负数,那么求给定的这个补码的补码就是要求的原码。

【例】已知一个补码为11111001,则原码是10000111(-7)。
因为符号位为“1”,表示是一个负数,所以该位不变,仍为“1”。
其余七位1111001取反后为0000110;
再加1,所以是10000111。

PS:没有无符号左移;
计算机表示数字正负不是用+ -加减号来表示,而是用最高位数字来表示,0表示正,1表示负


  1. Java基本数据类型所占字节数

            数据类型       字节数     默认值
            byte          8bit              
            boolean       8bit     false
            char          8bit        
            short         16bit      0
            int           32bit      0
            long          64bit      0L
            float         32bit      0.0f
            double        64bit      0.0d
    
  2. 位运算

        位与&  (真真为真,真假为假,假假为假)
        位或 |   (真真为真,真假为真,假假为假)
        位非 ~  (取反码)
        位异或 ^ (真真为假,真假为真,假假为假)  相同则为假
        有符号左移:按二进制形式把所有的数字向左移动对应的位数,高位移出(舍弃),低位的空位补零。
    
        有符号右移>>(若正数,高位补0,负数,高位补1)
        -4>>2
            1111 1111 1111 1111 1111 1111 1111 1100   补码
            1111 1111 1111 1111 1111 1111 1111 1111   右移,最左边空出两位按规则负数空位补1
            1000 0000 0000 0000 0000 0000 0000 0000   解码
            1000 0000 0000 0000 0000 0000 0000 0001   补码(补码即最后一位+1)
            结果:-1
                    无符号右移:高位的空位补零
    
  3. 位运算的应用

    1).  判断int型变量a是奇数还是偶数    
             a&1  = 0 偶数 
             a&1 = 1 奇数
    2).  求平均值,比如有两个int类型变量x、y,首先要求x+y的和,再除以2,但是有可能x+y的结果会超过int的最大表示范围,所以位运算就派上用场啦。
            (x&y)+((x^y)>>1); 
    3.  对于一个大于0的整数,判断它是不是2的几次方
            ((x&(x-1))==0)&&(x!=0); 
    4.  比如有两个int类型变量x、y,要求两者数字交换,位运算的实现方法:性能绝对高效
            x ^= y; 
            y ^= x; 
            x ^= y; 
    5. 求绝对值
            int abs( int x ) 
           { 
             int y ; 
             y = x >> 31 ; 
            return (x^y)-y ;        //or: (x+y)^y 
           }
    6.  取模运算,采用位运算实现:
             a % (2^n) 等价于 a & (2^n - 1) 
    7.  乘法运算   采用位运算实现
             a * (2^n) 等价于 a << n
    8.   除法运算转化成位运算
              a / (2^n) 等价于 a>> n 
    9.   求相反数
             (~x+1) 
    10  a % 2 等价于 a & 1 
    
  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值