今夜IT网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
查看: 1113|回复: 0

C/C++ 位操作符使用

[复制链接]
发表于 2012-2-12 20:44:46 | 显示全部楼层 |阅读模式
本章小结:
1.掩码
就是一串2进制 对目标字段进行位与运算,屏蔽当前的输入位。

将源码与掩码经过逻辑运算得出新的操作数。其中要用到逻辑运算如OR运算。AND运算。用于如将ASCLL码中大写字母改作小写字母。 2. 异或 转换成补码运算

3.  用法:掩码 ;4. 用法:打开位 |
5.用法:关闭位 ;~

6. 用法:转置位 ^7. Value的第bit_number位置1       Value |= 1 << bit_number;
8. Value的第bit_number位置0       Value ;= ~( 1 << bit_number );
9.value ; 1 << bit_number 如果该位置已被置为1,则表达式的结果为非零值

C/C ++提供位逻辑运算符移位运算符。二者只能用于整形和字符型。位运算符是对每位进行操作而不影响左右两位,这有别于常规运算符(;;|| !)是将整个数进行操作的。
一.    位逻辑运算符
1    ~ 按位取反
1变为0,将0变为1
EG
~(10011010)
(01100101)
注:
VC++编译器,计算~10,得出的结果是-11。为什么不是5
10的二进制表示为1010,按位取反应该为0101,也就是十进制的5,为什么会得出-11
VC32位编译器,所以
10 = 00000000 00000000 00000000   00001010
~10 = 11111111 11111111   11111111   11110101 =   -11
可以通过掩码(位与) 15位与
   15 = 00000000 00000000 00000000   00001111
~10 = 00000000 00000000 00000000   00000101   =   -11
2    ; 按位取与
只有两个操作数都是1结果才是1,否则为0
10 = 00000000 00000000 00000000   00001010
12 = 00000000 00000000 00000000   00001100
;
8 = 00000000 00000000 00000000   00001000
3    | 按位取或
两个操作数任意一位为1结果就是1
10 = 00000000 00000000 00000000   00001010
12 = 00000000 00000000 00000000   00001100
|
14 = 00000000 00000000 00000000   00001110
      
4    ^ 按位异或
两个操作数不同为1,相同为0
10 = 00000000 00000000 00000000   00001010
12 = 00000000 00000000 00000000   00001100
^
14 = 00000000 00000000 00000000   00000110
      

5    用法:掩码掩码是通过;(位与)将某些位设置为开(1),将某些位设置为关(0)。将掩码0看做不透明,将1看着透明。
EG
如只显示第二、三位
107 = 0110 1011
6            = 0000 0110
;
2   = 0000 0010
      

6    用法:打开位打开位是通过 |(位或)打开一个值的特定位,同时保持其他位的不变。这是因为和0位或都为0,和1位或都为1
EG
如只打开第二、三位
107 = 0110 1011
6   = 0000 0110
|
111 = 0110 1111

7    用法:关闭位关闭某些位
EG
如关闭第二、三位
107 = 0110 1011
6    = 0000 0110
; ~
105 = 0110 1001

8    用法:转置位如果一位为1则转置为0,如果一位为1则转置为0
EG
如转置第二、三位
107 = 0110 1011
6    = 0000 0110
^
105 = 0110 1101
      
二.    移位运算符
    [li]<< 左移[/li]
左移运算符是把操作数的值的每一位向左移动,移动的位数有右边的操作数决定,右侧空出的位数用0填充
EG
如转置第二、三位
107 = 0110 1011 <<2
<<
172 = 1010 1100
      
       在计算机中由于是32位的
107 = 0000 0000   0000 0000   0000 0000   0110 1011 <<2
<<
428 = 0000 0000   0000 0000   0000 0001   1010 1100
    [li]>> 右移[/li]
右移运算符是把操作数的值的每一位向右移动,移动的位数有右边的操作数决定,左边丢弃的位数用0填充
EG
如转置第二、三位
107 = 0110 1011 >>2
>>
26 = 0001 1010



    一、传统的C方式位操作:
    1.基本操作:
       使用一个unsigned int变量来作为位容器。
    2.操作符:
    |   按位或操作符:result=exp1|exp2;exp1exp2中对应位中至少有一个为1时,result中对应位为1,否则为0
    ;  按位与操作符::result=exp1;exp2;exp1exp2中对应位全为1时,result中对应位为1,否则为0
    ^  按位异或或操作符:result=exp1^exp2;exp1exp2中对应位不相同时,result中对应位为1,否则为0
    ~  反转操作符:将位容器中的所有位都反转,1变为00变为1
    << 按位左移操作符:exp<<n,将容器中所有的位向左移n位,空出的位用0填充。
    >> 按位右移操作符:exp>>n,将容器中所有的位向右移n位,空出的位用0填充。
    |=,;=,^= 分别对应|;^三种操作符的复合操作符。
    3.常用操作
       这里我们假设有一个resultunsigned int变量用来储存32个学生的成绩(通过和不通过分别用01),这样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作按位异与操作其值不变

    二、C++中的bitset容器
    1.头文件:
      #include <bitset>
    2.声明一个容器:
    (a)声明一个指定位数的空容器(所有位设为0: bitset<int> bits;
    (b)声明一个指定位数并将指定的几个位初始化为相应值的容器: bitset<n> bits(int);
         bitdet<int> bits(string;)
    总结:bitset模板类中类型参数传递容器的位数,而构造函数参数通过一个int或一个string;值来从右至左初始化容器中的相应值。
    3.bitset的基本用法:

    操作
    功能
    用法
    test(pos)
    pos位是否为1?
    a.test(4)
    any()
    任意位是否为1?
    a.any()
    none()
    是否没有位为1?
    a.none()
    count()
    值是1的位的小数
    count()
    size()
    位元素的个数
    size()
    [pos]
    访问pos
    a[4]
    flip()
    翻转所有位
    a.flip()
    flip(pos)
    翻转pos
    a.flip(4)
    set()
    将所有位置1
    a.set()
    set(pos)
    pos位置1
    a.set(4)
    reset()
    将所有位置0
    a.reset()
    reset(pos)
    pos位置0
    a.reset(4)
    4.bitset与传统C位操作及字符串的转换
       可以通过to_string()成员将容器转输出为一个string字符串,另外还可以用to_long()成员将容器输出到传统的用于C风格的位容器中。如:
      unsigned long bits = bits.to_long();
      sting str(bits.to_string());
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 官方QQ群

QQ|小黑屋|手机版|今夜IT网 (京ICP备11034012号) 

Powered by Discuz! X3.2

快速回复 返回顶部 返回列表