- 问题 :
- 把地址为0x80040的寄存器的最低4位设置为0110
- 解决方案
- 使用位运算
- 什么是位?
- 内存的基本单元是字节,一个字节有八位
- 位与 &
- 0 & 0 0
- 0 & 1 0
- 1 & 0 0
- 1 & 1 1
- 对应位,都是1,结果才是1
- 00001000
- 00000011
- 00000000 -> 0
- cout<<"8 & 3"<<(8 & 3)<<endl;
- 结果为0
- 位或 |
- 0 | 1 1
- 0 | 0 0
- 1 | 0 1
- 1 | 1 1
- 对应位都是0 则为0
- 8 | 3的计算
- 00001000
- 00000011
- 00001011 -> 11
- 位非 ~
- ~1 0
- ~0 1
- 取反
- 给8进行位非操作
- 00001000
- 11110111
- usigned char x = ~8;
- cout<<(int)x<<endl;
- 输出结果为 247
- 异或 ^
- 0 ^ 0 0
- 1 ^ 1 0
- 0 ^ 1 1
- 1 ^ 0 1
- 两位相同为0,不相同为1
- 8 ^ 3 进行异或操作
- 00001000
- 00000011
- 00001011
- cout<<(8 ^ 3)<<endl;
- 输出结果为 11
- <<左移
- 右边的位用0来填充,移动超出左边边界的位则直接抛弃,向左移动n个位置,就等同于乘以2的n次方
- 只适应于:int short long char 等定点数类型(float,double,浮点数类型不能使用)
- cout<<(8<<3)<<endl;
- 输出结果位8*2*2*2 = 64
- 00001000
- 01000000
- >>右移
- 如果左操作数是无符号类型,则左边多出来的位用0来填充
- 如果左边操作数是有符号类型,则左边多出来的位用符号位(最高位)来填充
- 向左移动n个位置,就等同于除以2的n次
- 只适应于int long char short 等定点数类型(float/double浮点数类型不能使用)
- 00001000
- 00000001
- cout<<(8>>3)<<endl;
- 输出结果位 1
- 应用 :把一个整数的最低4位设置为0110
-
//将数字8(00001000)的二级制后四位设置为0110 //第一步先将数字把的后四位清零,与数字00001000进行位|运算 int x = 65; x = x & ~15;//15 00001111 ~15 11110000 x = x | 6; cout<<x<<endl;
-