0
点赞
收藏
分享

微信扫一扫

《C++新经典》第11章 位运算

JakietYu 2022-05-01 阅读 61
c++

《C++新经典》第11章 位运算

11.1 位的概念和位运算符简介

11.1.1 位的概念

1字节由8个二进制位组成,最左边的位称为最高位,最右边的位称为最低位,每个二进制位的值是0或者1。

11.1.2 位运算符简介

  1. 按位与运算符&
    两个运算量相应位都为1时为1,否则为0。
    0&0=0;0&1=0;1&0=0;1&1=1。
unsigned int temp = 38 & 22; //6
00100110	//38
&
00010110	//22
--------
00000110	//6
  1. 按位或运算符|
    两个运算量相应位存在1时为1,否则为0。
    0|0=0;0|1=1;1|0=1;1|1=1。
unsigned int temp = 38 | 22; //54
00100110	//38
|
00010110	//22
--------
00110110	//54
  1. 按位异或运算符^
    两个运算量相应位不同为1,相同为0。
    0^0=0;0^1=1;1^0=1;1^1=0。
unsigned int temp = 38 ^ 22; //48
00100110	//38
^
00010110	//22
--------
00110000	//48
  • 保持二进制位不变,可以和0做异或运算,可以和1做与运算,可以和0做或运算
    0^0=0,1^0=10&1=0,1&1=10|0=0,1|0=1
  • 翻转二进制位(0,1互变),可以和1做异或
    0^1=1,1^1=0
11000011
^
00001111	//高4位不变,低4位翻转
--------
11001100
  1. 取反运算符~
    对一个运算量的位取反,0变1,1变0。
    ~0=1;~1=0。

unsigned int temp = ~38; //4294967257
~
00000000 00000000 00000000 00100110	//38
--------
11111111 11111111 11111111 11011001	//4294967257
  1. 左移运算符<<
    一个数的二进制位左移若干位,右侧补0,每左移一位等价于乘以2(未溢出时)。

unsigned int temp = 15<<1; //15*2, 30
00001111	//15
<<1
--------
00011110	//30
  1. 右移运算符>>
    一个数的二进制位右移若干位(舍弃若干右侧最低位),左侧始终补0(逻辑右移)或者补0或1(算术右移,根据最高符号位决定),每右移一位等价于除以2(未溢出时)。
unsigned int temp = 15>>1; //15/2, 7
00001111	//15
>>1
--------
00000111	//7

位运算符和赋值运算符结合得到复合赋值运算符。
&=,|=,^=,<<=,>>=

11.2 位运算的具体应用

unsigned,32位,最右边最低位(第1位),最左边最高位(第32位),32个状态。

#define BIT(x) (1<<(x))

int i;
for(i=0; i<10; i++)
	printf("BIT(%d)=%d\n", i, BIT(i)); //1,2,4,8,16,32,...,512

enum EnumTask {
	ETask1 = BIT(0),
	ETask2 = BIT(1),
	ETask3 = BIT(2),
	ETask4 = BIT(3),
	ETask5 = BIT(4),
	ETask6 = BIT(5),
	ETask7 = BIT(6),
	ETask8 = BIT(7),
	ETask9 = BIT(8),
	ETask10 = BIT(9),
}
unsigned task = 0;

if(task & ETask7) {
	printf("task第7位为1\n");
} else {
	printf("task第7位为0\n");
	task |= ETask7; //task第7位设置为1
}

if(task & ETask7) {
	printf("task第7位为1\n");
}
举报

相关推荐

0 条评论