位运算

<pre name="code" class="cpp">常用操作
   这里我们假设有一个result的unsigned int变量用来储存32个学生的成绩(通过和不通过分别用0和1),这样result就有33位(result从右至左,从0开始计算位数,在这个例子中0位被浪费)。
(a) 将第27位设置为及格(设作1)其他位不变:
   result|=(1<<27) //任意的位值与1作按位或操作其值为1,而与0作按位与操作其值不变
(b) 将第27位设置成不及格(设为0)。
   result&=~(1<<27) //任意的位值与0作按位与操作其值为0,而与1作按位与操作其值不变
(c) 反转第27位的值。
   result^=(1<<27) //任意的位值与1作按位异或操作其值为1,而与0作按位异与操作其值不变
 

 
感觉切换位 那里有问题啊
</pre><pre code_snippet_id="1683618" snippet_file_name="blog_20160514_1_2802433" name="code" class="cpp"><pre name="code" class="cpp">#include <bitset>
#include <iostream>
#include <string>
#include <limits>

using namespace std;

int main(int argc, char* argv[])
{
 	    cout<<"==移位操作===================="<<endl;
 	    //左移/右移n位将所有位向左/右移动n位,腾出来的位置补零,超出边界的位置被丢弃。相当于乘以/除以2的n次方。
 	    int x=20;
 	    int y=x<<3;
 	    cout<<y<<endl; /// 160
 	    cout<<hex<<y<<endl; /// a0
 	    ///cout<<oct<<y<<endl; 八进制
 	    y=y>>3;
 	    cout<<y<<endl;/// 十进制是20  输出的是16进制 : 14
 	    y=y>>3;
 	    cout<<y<<endl<<endl; ///  2
 	    //打开指定位(将指定位设置为1):将该数的第n位于1或。
 	    //通过移位运算符来构造掩码,将1左移n-1位,然后于该数或。
 	    cout<<"==1:将指定位设置为1===================="<<endl;
 	    int lottabits= 5,bit=16,xbit,c,j,k=4;

 	    cout << bit << endl;///居然输出 16  进制
 	    cout << hex << bit << endl;
 	    xbit = (~bit);///  bit取反
 	    cout << xbit << endl;
 	    cout << bit << endl;
 	    cout << ~bit<< endl;
 	    c=lottabits|bit;
 	    j=lottabits;
 	    j|= 1<<k;
 	    bitset<32> bita(lottabits);
 	    bitset<32> bitb(bit);
 	    bitset<32> bitc(c);
 	    bitset<32> bitd(j);
 	    bitset<32> bitx(xbit);

 	    cout <<"5 bits  is: "<<bita<<endl<<"16 bits is: "<<bitb<<endl<<"5|16    is: "<<bitc<<endl;
 	    cout <<"5|=1<<4 is: "<<bitd<<endl<<endl;
 	    cout << bitx << endl;
 	    //切换指定位(将原来的0置为1,原来的1置为0):将该数的指定位于1异或。
 	    //
 	    cout<<"==2:切换指定位===================="<<endl;
 	    c=lottabits^bit;
 	    bitset<32> bitm(c);

 	    cout <<"5 bits  is: "<<bita<<endl<<"15 bits is: "<<bitb<<endl<<"5|15    is: "<<bitm<<endl<<endl;

 	    //关闭指定位(将指定位设置为0):将该数的指定位(第n位)于0于。
 	    //通过移位构造掩码,将1左移n-1位,然后取反 再于该数相与。
 	    cout<<"==3:关闭指定位===================="<<endl;
 	    int i=4;
 	    i=(~i);
 	    c=lottabits&i;
 	    j=lottabits;
 	    j &= ~(1<<2);
 	    bitset<32>    bith(c);
 	    bitset<32>    bitj(j);
 	    bitset<32>    biti(i);
 	    cout <<"5  bits  is: "<<bita<<endl<<"~4  bits is: "<<biti<<endl<<"5 &(~15) is: "<<bith<<endl;
 	    cout <<"5&(~(1<<2)): "<<bitj<<endl<<endl;

 	    //测试指定位(确定将指定位中对应位是否为1):将该数的指定位于1于操作,返回值不变。即lottabits&bit ==bit或 if(lottabits&bit)。
 	    //if(lottabits&1<<n-1)
 	    cout<<"==4:测试指定位===================="<<endl;
 	    c=lottabits&bit;
 	    bitset<32> bitf(c);
 	    cout <<"5  bits  is: "<<bita<<endl<<"~15 bits is: "<<bitb<<endl<<"5 &(~15) is: "<<bitf<<endl<<endl;
 	    cout<<"======================"<<endl;
 	}

有了下面的小程 就不难理解上面的输出了!!!
<pre name="code" class="cpp">#include<iostream>
using namespace std;
int main()
{
    int a = 16;
    int b = 32;
    cout << a << endl;
    cout << b << endl;
    cout << hex << a << endl;
    cout << b << endl;
    cout << a << endl;
    cout << dec << a << endl;
    cout << a <<endl;
}

/*
16
10
10
16
16

Process returned 0 (0x0)   execution time : 0.491 s
Press any key to continue.

*/


 
 

                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值