算法学习之路(六)——位操作

位操作Bit Manipulation)是程序设计中对位模式或二进制数的一元和二元操作。在许多古老的微处理器上,位运算比加减运算略快,通常位运算比乘除法运算要快很多。在现代架构中,情况并非如此:位运算的运算速度通常与加法运算相同(仍然快于乘法运算)。

位操作包括:

¬¬ 取反(NOT~
∩∩ 按位或(OR|
⊕⊕ 按位异或(XOR^
∪∪ 按位与(AND&
移位
移位是一个二元运算符,用来将一个二进制数中的每一位全部都向一个方向移动指定位,溢出的部分将被舍弃,而空缺的部分填入一定的值。
移位又分为
算术移位 : 空缺部分添加的数和符号有关
逻辑移位 : 统一添0

136. 只出现一次的数字
在这里插入图片描述
代码:

class Solution {
    public int singleNumber(int[] nums) {
        int res = 0;
        for (int num : nums) {
            res ^= num;
        }
        return res;
    }
}

解释

17 ^ 19 ^ 17 = 17 ^ 17 ^ 19 = 19

一个十进制数的二进制形式中1的个数

与运算
利用与运算0&1=0,不断将一个非零数不断将二进制形式中的1置于0

	public int getOneNum(int n) {
        int res = 0;
        while (n > 0) {
            n = n & (n - 1);
            res++;
        }
        return res;
    }

判断一个数是否为2的幂,
比如1=2 ^ 0, 2=2 ^ 1,4=2^2
与运算
利用与运算中,2&1=04&3=0,利用2的幂 - 1与2的幂的与运算结果为02的幂的二进制形式一定只有一位为1,其他为0,而他的减一形式一定是这一位为0,其他为1.

 public boolean isTwores(int n) {
        return (n & (n - 1)) == 0;
    }

将一个double类型的小数转换为二进制表示

 public String Double2Binary(double d) {
        StringBuilder res = new StringBuilder();
        int z = (int) d;
        res.append(Integer.toBinaryString(z));//整数部分
        d = d - z;
        //小数部分
        while(d != 0){
            int t = (int) (d * 2);
            res.append(t);
            d = d* 2 - t;
        }
        return  res.toString();
    }

一个重要结论:

10个相同的10进制数做不进位的加法,一定是0 ,   
2个相同的2进制数做不进位的加法,一定是0,         
k个相同的k进制数做不进位的加法,一定是0
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值