位运算符说明和示例

0. 位运算操作符共有以下几种:
  • & : 位与,都为1时,结果为1;否则为0。 (例:5 & 3 => 0101 & 0011 = 0001)
  • | : 位或,都为0时,结果为0;否则为1。 (例:5 | 3 => 0101 | 0011 = 0111)
  • ^ : 异或,相同为0,不同为1。 (例:5 ^ 3 => 0101 ^ 0011 = 0110)
  • ~ : 取反,二进制数按位取反,即将0变1,1变0。
  • << : 左移,左移几位表示该数据乘以2的几次方(左移为乘)。(例:3<<2 == 3*(2)^2 = 12)
  • `>> :右移,右移几位表示该数据除以2的几次幂(右移为除)。(例:6>>2 == 6 / (2^2) = 1)
1. 位运算符使用示例
1. 互换两个整数的值
void swap(int& a, int& b){
    a = a^b;
    b = a^b;
    a = a^b;
}
int main(){
    int a = 5;
    int b = 3;
    swap(a,b);
    std::cout << a << "  " << b << std::endl; //3 5
    return 0;
}
2. 两个整数相加
int add(int a, int b) {
    if(a==0)return b;
    if(b==0)return a;
    int m = 0,n = 0;
    while((a&b) != 0){
        m = a^b;
        n = (a&b)<<1;
        a = m;
        b = n;
    }
    return a|b;
}
int main(){
    int a = 5;
    int b = 3;
    std::cout << add(a,b) << std::endl;
    return 0;
}
3. 两个整数相乘
int multiply(int a, int b) {
    int result = 0;
    for(int i=1; i; i<<=1,a<<=1)
        if(b&i)
            result += a;
    return result;
}
int main(){
    int a = 5;
    int b = 3;
    std::cout << multiply(a,b) << std::endl;
    return 0;
}
4. 加1减1
int n = 1;
n = -~n;
// 现在 n = 2

int n = 2;
n = ~-n;
// 现在 n = 1
5. 输入一个整数n,输出该数二进制中1的个数
// 把一个整数减去1,再和原整数做与运算,会把该整数最右边的1变为0
// 一个整数的二进制中有多少1,就可以进行多少次这样的操作
int number(int n){
    int count = 0;
    while(n){
        ++count;
        n = (n-1) & n;
    }
    return count;
}

int main(){
    std::cout<< number(9)<<std::endl;
    return 0;
}

References:
  • https://blog.csdn.net/sinat_15029837/article/details/79579922?utm_source=blogxgwz9
  • https://zhuanlan.zhihu.com/p/79754598
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值