有趣的位运算

位运算不会溢出,外加运算速度快,但就是不容易想,需要思考一下

位运算

1.位与运算(&):两个二进制数的相同位都为1时那一位就成了1,其他情况都是0(像1个0和1个0或两个0)。
2.位或运算(|):两个二进制数的相同位只要有一个为1,那一位就成了1。
3.位异或运算(^):两个二进制数的相同位一个为1另一个为0是那一位成了1,其他情况都为0。
4.位左移(<<):例如1的2进制数是00000001,向左移一位一成了2二进制数变成了00000010。
5.位右移(>>) :例如2的2进制数是00000010.向右移一位就成了1二进制数成了00000001。
    这些是位运算的应用

1.判断奇偶数

    偶数的2进制数最后一位是0,奇数的2进制数最后一位是1,奇数1的2进制数是00000001,所以偶数和1做位与运算得到的数为0,奇数和1做位与运算得到的数为1,
代码如下,这里注意一下==判断比较符优先级高于位运算符所以位运算符那里要加括号

   int number;
   cin>>number;
   if( (number & 1) == 0)
   {
       cout<<"这是偶数";
   }
   else if((number & 1) == 1)
   {
       cout<<"这是奇数";
   }

2.判断一个数是不是2的幂

    2是一个偶数,它的2进制数最后一位是0,所以2的幂的2进制数的最后一位也是0,让这个数减1,这个数的2进制数的最后一位就成了1,所以让一个数和它减1后的数进行位与运算判断如果为0说明是2的幂否则不是2的幂代码如下

   int n;
   cin>>n;
   if( (n & (n-1)) == 0 )     //因为比较运算符的优先级高于位运算所以对进行位运算的部分加个括号,每当不清楚优先级先后时就加括号
   {
       cout<<"这个数是2的幂";    
   }
   else
   {
       cout<<"这个数不是2的幂";
   }

3.得到一个数的2进制数的某一位

    位运算中和1做位与运算很重要,一个数如何得到它2进制数的某一位,1的2进制数最后一位是0,其他位置都是0,所以让一个数和1做位与运算如果得到的是0则这个数的最后一位是0,然后我们让1左移一位就能判断出这个数的二进制数的第2位是多少,以次类推,如果位与运算得到的数不是0则这个数的最后一位数是1,代码如下

   int number;
   cin>>number;
   int bit;
   cin>>bit;
   if( (number & (1<<bit) ) == 0)  //  
    {
        cout<<"这个数的二进制数的"<<bit+1<<"位是0";
    }
    else
        cout<<"这个数的二进制数的"<<bit+1<<"位是1";

4.判断一个整数的二进制数中1的个数

1.和1位与运算代码如下

   int number;
   cin>>number;
   int bit = 0;
   int count = 0;
   while(bit < 32)
   {
       if( (number & (1<<bit) )= 0)  //  
       {
           count++;
       }       
       bit++}
   cout<<number<<"的2进制数中1的个数为"<<count;

这种方法思路简单但是这个过程每次都要执行32次,因为int是4个字节即32位,有点浪费时间
2.和这个数的减1做位与运算
    一个数和它的减1做位与运算它的二进制数就会少一个1,代码如下

   int number;
   cin>>number;
   int count = 0;
   while(number != 0)
   {
       number = (number & number-1);
       count++;   
   }
   cout<<number<<"的2进制数中1的个数为"<<count;

5.交换两个变量的值

     在平常的整数运算中a+(-a)=0;在位运算中了a^a=0; ^和+号大部分情况等价满足整数加法规律, (a ^ b) ^ a = b;所以交换两变量值有一个位运算方法

int a = 3, b = 5;
 cout<<"交换前:" << a <<" "<< b << endl;
 a = a ^ b;
 b = a ^ b;
 a = b ^ a;
 cout << "交换后:" << a <<" "<< b << endl;
 return 0;
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白月光soul

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值