六、位运算
6.1 进制定义与输出
- 定义
- 二进制:
0b
或0B
- 八进制:
0
- 十六进制:
0x
或0X
- 二进制:
- 输出
- 八进制:
%o
- 十六进制:
%x
(x是大写输出的也是大写) - 无符号的十进制整数:
%u
- 八进制:
6.2 位的运算
- 置零、置1
- 切换(0->1,1->0)
- 检查位的值
- 移位
#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
int a, b, mask;
/* 将高位 置零*/
a = 0x3f4f;
mask = 0xff;
printf("%x & %x = %x\n", a, mask, a & mask); /* 3f4f & ff = 4f */
/* 检查位的值 */
a = 0x3f4f;
mask = 0b10; /* 只保留第二位 */
printf("%x & %x = %x\n", a, mask, a & mask); /* 3f4f & 2 = 2 */
if((a & mask) == mask) printf("该位为1\n");
else printf("该位为0\n");
/* 将某位置0 */
a = 0x3f4f;
mask = 0xfffe; /* 将第一位置0 */
printf("%x & %x = %x\n", a, mask, a & mask); /* 3f4f & fffe = 3f4e */
/* 将某位置0 关闭*/
a = 0x3f4f;
mask = 0x1; /* 第一位置0 */
printf("%x & ~%x = %x\n", a, mask, a & ~mask); /* 3f4f & ~1 = 3f4e */
/* 将某位置1 打开 */
a = 0x3f4f;
mask = 0x8000; /* 最高位置1 */
printf("%x | %x = %x\n", a, mask, a | mask); /* 3f4f | 8000 = bf4f */
/* 切换某一位 => 0->1 or 1->0 */
/*
mask = 1;
a = 0, a ^ mask = 0 ^ 1 = 1
a = 1, a ^ mask = 1 ^ 1 = 0
*/
a = 0x3f4f;
mask = 0x8000; /* 切换最高位 */
printf("%x ^ %x = %x\n", a, mask, a ^ mask); /* 3f4f | 8000 = bf4f */
/* 移位: rgb 分别存在 第123个字节 分别取出来 */
unsigned long color = 0x003feb2;
unsigned int red = color & 0xff;
unsigned int green = (color >> 8) & 0xff;
unsigned int blue = (color >> 16) & 0xff;
printf("color: %x, red: %x, green: %x, blue: %x\n", color, red, green, blue);
return 0;
}
6.3 练习
-
接受一个int类型的参数,并返回该参数中打开位的数量。
#include <iostream> #include <cstdio> using namespace std; /** * @brief Get the openbit num object * * @param x * @return int (返回x中打开位的数量) */ int get_openbit_num(int x) { int cnt = 0; for(int i = 0;i < 32; i++) { if((x >> i) & 0x1 == 0x1) /* 检查第i位是否为1 */ cnt ++; } return cnt; } int main() { int x = 0xf1ff; cout << get_openbit_num(x) <<endl; // 13 return 0; }
-
接收两个int参数:一个是值,一个是位的数量。如果指定位的位置为1,返回1;否则返回0。
#include <iostream> #include <cstdio> using namespace std; /** * @brief x在pos位的值 * * @param x * @param pos * @return true * @return false */ bool judge_bitx(int x, int pos) { int mask = 1; mask <<= pos; /* 将第pos位设置为1 */ return (x & mask) == mask; } int main() { int x = 0xf1ff; cout << judge_bitx(x, 27) <<endl; return 0; }
-
高低位互换
#include <iostream> #include <cstdio> using namespace std; int rotate_high_with_low(int x) { int temp = x & 0xffff; /* temp保存低位 */ x >>= 16; x |= (temp << 16); return x; } int main() { int x = 0x3a88f1ff; printf("before: %#X, after: %#X\n", x, rotate_high_with_low(x)); /* before: 0X3A88F1FF, after: 0XF1FF3A88 */ return 0; }