C/C++位运算

/ C/C++默认分类 / 没有评论 / 180浏览

位运算

  • 二进制针对charshortint(unsigned)类型
  • 下图来源于(这里)

按位与&、按位或|、按位异或^、按位取反~

int lhs = 0x33; // 0011 0011
int rhs = 0x66; // 0110 0110

按位与&

// 按位与 与1相比,相同为1,不同为0; 即1&1=1, 1&0=0, 0&0=0;
int ret = lhs&rhs; // 0010 0010

按位或

// 按位或 与0相比,相同为0,不同为1; 即1&1=1, 1&0=1, 0&0=0;
int ret = lhs|rhs; // 0111 0111

按位异或

// 按位异或 相等为0,不同为1; 即1^1=0, 0^0=0, 1^0=1
int ret = lhs ^ rhs; // 0101 0101

按位取反

// 按位取反~1=0, ~0=1
ret = ~lhs; // 1100 1100
ret = ~rhs; // 1001 1001

移位运算

无符号移位

unsigned char lhs = 0x33; // 0011 0011

// 左移运算,左边舍弃,右面补0
char ret = (lhs << 1); // 0110 0110
// 右移运算,右边舍弃,左边补0
char ret = (lhs >> 1); // 0001 1001

// 无符号-->最高位填0, 低位舍弃
unsigned char ths = -64; // -64 二进制位1111...1100 0000(8位表示,32为高字节补24个1)。ths无符号,所以所有符号位将1换成0.则无符号的-64在二进制中表示为000...1100 0000
printf("ths : %d", ths)	 // 192 -->000...1100
ret = (ths >> 1); // 0110 0000

有符号移位

char rhs = -64;
// 获取有符号二进制数:
// step1. 先得到无符号二进制数
// step2. 得到这个2进制数的反码(按位取反)
// step3. 对这个二进制数进行补码操作(即得到还负数在二进制中的表示)
// 例子1(得到-62的二进制): 64原码为0100 0000,反码后为1011 1111,补码后为1100 0000(即为-64的二进制数)
// 例子2(得到-21的二进制): 21源码为0001 0101,反码后为1110 1010,补码后为1110 1011(即为-21的二进制数)
ret = (rhs >> 1);// 1110 0000 = (1100 0000 >> 1)

应用

void t3()
{
	// 字节位(8bit) 1.合格; 其他.为不合格
	char BIT_C		= (1 << 0);	// 8个字节的第1位表示C技能是否优秀	0000 0001
	char BIT_CPP	= (1 << 1);	// 8个字节的第2位表示C++技能是否优秀	0000 0010
	char BIT_JAVA	= (1 << 2);	// 8个字节的第3位表示JAVA技能是否优秀	0000 0100 
	char BIT_CSHARP = (1 << 3);	// 8个字节的第4位表示C#技能是否优秀	0000 1000

	printf("BIT_C		= %d\n", BIT_C);
	printf("BIT_CPP		= %d\n", BIT_CPP);
	printf("BIT_JAVA	= %d\n", BIT_JAVA);
	printf("BIT_CSHARP	= %d\n", BIT_CSHARP);

	char sszyc8 = BIT_C | BIT_CPP | BIT_CSHARP | BIT_JAVA; // 默认所有技能都合格	(0000 1111)
	printf("init sszyc8 = %d\n", sszyc8);
	char sszyc9 = BIT_C | BIT_CPP | BIT_CSHARP; // 默认除了java,其他所有技能都合格	(0000 1011)
	printf("init sszyc9 = %d\n", sszyc9);

	// 查询sszyc9的C技能是否合格
	if (sszyc9 & BIT_CPP) //1
		printf("c++技能合格\n");
	else
		printf("c++技能不合格\n");

	// 查询sszyc9的JAVA技能是否合格
	if (sszyc9 & BIT_JAVA) //0
		printf("java技能合格\n");
	else
		printf("java技能不合格\n");

	// 设置sszyc9的java技能技能合格
	sszyc9 = sszyc9 | BIT_JAVA;
	if (sszyc9 & BIT_JAVA)
		printf("java技能合格\n");
	else
		printf("java技能不合格\n");
}
点击这里给我发消息
嘿!有什么能帮到您的吗?