『你不知道的位运算,原来还可以这么用』

一、计算一个数的二进制表示中1的个数

一个十进制数字减1后,它的最低位的1位置变为0,下一个位置变为1,所以把它的最低位的1变为0.(比如:数字6的二进制表示是00000110,数字5的二进制表示是00000101,进行一次操作,两个数字按位相与之后就变为00000100,数字6的二进制表示中1的个数就减少一个)

int countOf_1(int num){
    int ans = 0;
    while(num){
        num &= num - 1;
        ans++;
    }
    return ans;
}



二、判断一个数是不是2的n次方

判断一个数是不是2的n次方,即判断一个数的二进制位的最高位是不是1,且只有一个

bool is_2Power(int num){
    num &= num - 1;
    return num == 0;
}



三、整数n可以经过多少次变化变成m(指改变多少二进制位)

int countChange(int n, int m){
    return countOf_1(n ^ m);//调用第一个函数
}



四、获得最大、最小的int值

pair<int, int> getLimitInt(){
    pair<int, int> p;
    p.first = ~(1 << 31);//int最大值
    p.second = 1 << 31;//int最小值
    return p;
}



五、判断一个数的奇偶性

判断一个数是否为奇数即判断一个数的二进制表示中最低位是否为1

bool isOdd(int num){
    return num & 1 == 1;
}



六、交换两个数的值

十进制中交换两个数a, b的值可以这样:a = a + b; b = a - b; a = a - b; 类似,二进制中可以用异或操作:a = a ^ b; b = a ^ b; a = a ^ b;

void swap(int a, int b){
    a ^= b ^= a ^= b;
    return ;
}



七、求两个数的平均值

int getAverage(int m, int n){
    return (m + n) >> 1;
}



八、求倒数第m位的值

int getMthN(int n, int m){
    return (n >> (m - 1)) & 1;
}



九、把倒数第m位设置为1

void setMthN_1(int n, int m){
    n |= (1 << (m - 1));
    return ;
}



十、把倒数第m位设置为0

void setMthN_0(int n, int m){
    n &= ~(1 << (m - 1));
    return ;
}

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值