<<
) 等效于将数乘以2的某个幂次。>>
) 等效于将数除以2的某个幂次(舍弃小数部分)。示例:计算8 * 4
和32 / 4
:
int x = 8;
int result1 = x << 2; // 8 * 2^2 = 32
printf("%d\n", result1); // 输出:32
int y = 32;
int result2 = y >> 2; // 32 / 2^2 = 8
printf("%d\n", result2); // 输出:8
int power_of_2 = 1 << 5; // 2^5 = 32
printf("%d\n", power_of_2); // 输出:32
示例:检查第3位(从右向左计数)的值。
int x = 13; // 二进制:1101
if (x & (1 << 2)) { // 检查第3位(值为1)
printf("3rd bit is set\n");
} else {
printf("3rd bit is not set\n");
}
1
。示例:统计整数x的二进制中有多少个1。
int count = 0;
int x = 29; // 二进制:11101
while (x) {
count += (x & 1);
x >>= 1;
}
printf("Number of 1s: %d\n", count); // 输出:4
示例:设置和检查权限:
int permissions = 0b0101; // 初始权限
permissions |= (1 << 2); // 设置第3位权限
if (permissions & (1 << 2)) { // 检查第3位权限
printf("Permission granted\n");
}
示例:将x
的位进行翻转(假设x为8位数):
unsigned char x = 0b00001111; // 初始二进制数
unsigned char reversed = 0;
for (int i = 0; i < 8; i++) {
reversed = (reversed << 1) | (x & 1);
x >>= 1;
}
printf("%d\n", reversed); // 输出:240(0b11110000)
int x = 5, y = 9;
x = x ^ y;
y = x ^ y;
x = x ^ y;
printf("x = %d, y = %d\n", x, y); // 输出:x = 9, y = 5
x & 1
可以快速判断一个数是奇数还是偶数。示例:判断一个数是否为偶数。
int x = 42;
if (x & 1) {
printf("奇数\n");
} else {
printf("偶数\n");
}
x & 1
会提取整数的最低有效位(LSB)。若最低位为1,数为奇数;若为0,数为偶数。该方法效率高于使用模运算%
。&
运算结合取反可以用于清除整数的某个位。示例:清除整数x
的第2位(从右数起)。
int x = 15; // 二进制:1111
int mask = ~(1 << 1); // 掩码:1110,取反后清除第2位
x = x & mask; // 清除第2位
printf("%d\n", x); // 输出:13(二进制:1101)
~(1 << n)
创建掩码,可以将第n+1
位设置为0,其余位保持不变,从而有效清除该位。示例:提取x
中的低4位。
int x = 29; // 二进制:11101
int mask = 0b1111; // 掩码:1111
int result = x & mask; // 提取低4位
printf("%d\n", result); // 输出:13(二进制:1101)
x
的低4位,掩码部分为1的位将被保留,其他位被清除。&
运算可以用来计算两个二进制数的交集,即哪些位在两个数中都是1。示例:计算两个数的交集位。
int a = 29; // 二进制:11101
int b = 23; // 二进制:10111
int result = a & b; // 二进制:10101
printf("%d\n", result); // 输出:21(二进制:10101)
&
运算返回两个数都为1的位,结果用于分析交集或公共属性。x & (x - 1)
可以快速判断一个数是否是2的幂次。示例:判断x
是否是2的幂次。
int x = 16; // 二进制:10000
if (x > 0 && (x & (x - 1)) == 0) {
printf("%d 是2的幂次\n", x);
} else {
printf("%d 不是2的幂次\n", x);
}
1
,通过x & (x - 1)
将最低的1清除,如果结果为0,则说明该数是2的幂次。&
可以用于快速判断两个数是否具有相同的符号。示例:判断x
和y
是否符号相同。
int x = -5;
int y = -10;
if ((x & y) > 0) {
printf("x和y符号相同\n");
} else {
printf("x和y符号不同\n");
}
x & y
来查看最高位(符号位),如果符号位相同,结果为正。|
(按位或运算符)用于在两个二进制数的对应位上执行或操作,只要两个位中至少有一个是1,结果就为1。|
运算在基本算法中广泛用于设置特定位、合并数据和实现快速运算,以下是一些具体示例说明它的作用:
|
运算常用于将数的某个位设置为1,而不改变其他位的值。示例:将整数x
的第3位(从右往左数)设置为1。
int x = 8; // 二进制:1000
int mask = 1 << 2; // 掩码:0100,对应第3位
x = x | mask; // 设置第3位
printf("%d\n", x); // 输出:12(二进制:1100)
x
按位或运算,可以保留x
的其他位,同时将第3位设置为1。用于二进制标记、开关状态管理等场景。|
运算可以将两个数的不同位合并到一起。示例:合并两个数a
和b
的特定位。
int a = 0b1010; // 二进制:1010
int b = 0b0101; // 二进制:0101
int result = a | b; // 二进制:1111
printf("%d\n", result); // 输出:15(二进制:1111)
a
和b
的二进制表示分别为1010
和0101
,合并后结果为1111
。这种合并用于位集成、数据汇总和标志位操作。|
运算一次性设置多个位组为1,而不改变其他位。示例:将x
的低4位设置为1。
int x = 16; // 二进制:10000
int mask = 0b1111; // 掩码:低4位为1
x = x | mask; // 设置低4位
printf("%d\n", x); // 输出:31(二进制:11111)
1111
按位或,可以直接将x
的低4位设置为1。常用于需要将特定位范围设为固定值的情境。