c++进行按位与、或、非、异或、移位运算, 计算汉明距离

  1. 与、或、非、异或 运算
    都是二进制运算

    “ & “
    都是1才得1
    0&0 = 0
    1&0 = 0
    0&1 = 0
    1&1 = 1
    例如 5&12 = 4
    0 1 0 1 = 5
    1 1 0 0 =12
    .------------
    0 1 0 0 =4

    或 " |"
    只要有一个是1,就得1
    1 | 0 = 1
    0 | 1 = 1
    0 | 0 = 0
    1 | 1 = 1
    例如 5|12 =13
    0 1 0 1 =5
    1 1 0 0 =12
    .------------
    1 1 0 1 =13

    " ~"
    取反
    ~1 =0
    ~0 =1
    例如:
    ~5 = 10
    0 1 0 1 = 5
    .-------
    1 0 1 0 =10

    异或 " ^ "
    两个不一样,才得1
    1^1 = 0
    1^0 = 1
    0^1 = 1
    0^0 = 1
    例如:
    5^12 = 9
    0 1 0 1 = 5
    1 1 0 0 =12
    .---------
    1 0 0 1 = 9

  2. 移位操作

    右移 >>
    二进制向右移动, 移动掉的最右边的几位舍弃

    左移 <<
    向左移动几位,最右边补0

  3. 汉明距离就是二进制数,不同的个数,所以要用到异或操作^,如下两行
    0 1 0 1 1
    0 0 1 1 1
    首先对这两个数进行异或^运算,得到
    0 1 1 0 0
    统计1的个数,所以汉明距离就是1的个数:2

  4. c++进行与&或|非~异或^移位>>, << 操作,计算汉明距离

    #include<iostream>
    #include<cmath>
    using namespace std;
    int main()
    {
        unsigned int a = 5;    //0 1 0 1
        unsigned int b = 12;   //1 1 0 0
    
        //与
        cout<<"a&b = "<< (a&b) <<endl;  //4
    
        //或
        cout<<"a|b = "<< (a|b) <<endl;  //13
    
        //非
        //~a只能要后4位
        int a_=(~a);
        int a1=0;
        for(int i=0;i<4;i++)
        {
            a1=a1+pow(2,i)*(a_&1); //a_&1 是取a_ 二进制最后一位
            a_ = (a_>>1); //a_ 右移一位
        }
        cout<<"~a = " << (a1) <<endl;  //10
    
        //异或
        cout<<"a^b = "<< (a^b) <<endl; //9
    
    	//移位
    	cout<<"a>>2 = "<<(a>>2)<<endl; //0101 >>2  01  = 1
    	cout<<"a<<2 = "<<(a<<2)<<endl; //0101 <<2 010100 = 20
    
        //汉明距离
        int c = (a^b);  //就是统计a^b中1的个数
        int dist = 0;
        while(c!=0)
        {
            dist += (c&1);  //最后一位是1 就是1
            c>>=1;  //就是 c = (c>>1)
        }
        cout<<"汉明距离: "<<dist<<endl;  //2
    
        return 0;
    }
    

    运行结果:

    a&b = 4
    a|b = 13
    ~a = 10
    a^b = 9
    a>>2 = 1
    a<<2 = 20
    汉明距离: 2
    
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值