C语言 位运算详解及示例代码
什么是位运算
在计算机中,数据存储采用二进制的形式,二进制位只有0和1两个取值。位运算是一种直接针对二进制位进行操作的运算,常见的位运算包括按位与、按位或、按位异或、位左移、位右移等。
位运算的分类
在C语言中,位运算可以分为3类:按位逻辑运算符、按位位移运算符和按位赋值运算符。
按位逻辑运算符
按位逻辑运算符用于操作二进制数中的每一位。C语言中的按位逻辑运算符包括:
- 按位与:&
- 按位或:|
- 按位异或:^
- 按位取反:~
按位与运算符&的结果为1,则表示两个数的对应二进制位上都是1;按位或运算符|的结果为1,则表示两个数的对应二进制位上至少有一个是1;按位异或运算符^的结果为1,则表示两个数的对应二进制位上一个是1一个是0;按位取反运算符~将一个数的二进制位0变1,1变0。具体示例如下:
#include <stdio.h>
int main() {
int a = 0b1101; // a的二进制为1101
int b = 0b0011; // b的二进制为0011
printf("a & b = %d\n", a & b); // 输出:a & b = 0001,相当于a和b的二进制的每个位置上进行与运算
printf("a | b = %d\n", a | b); // 输出:a | b = 1111,相当于a和b的二进制的每个位置上进行或运算
printf("a ^ b = %d\n", a ^ b); // 输出:a ^ b = 1110,相当于a和b的二进制的每个位置上进行异或运算
printf("~a = %d, ~b = %d\n", ~a, ~b); // 输出:~a = 11111111111111111111111111110010, ~b = 11111111111111111111111111111100
return 0;
}
按位位移运算符
按位位移运算符可以将一个十进制的数字转为二进制后,将二进制数向左或向右移动一定的位数,然后转为十进制。C语言中的按位位移运算符包括:
- 左移运算符:<<
- 右移运算符:>>
假设有一个数x,将它左移y位,相当于将x的二进制数转化为十进制后乘以2的y次方,将它右移y位,相当于将x的二进制数转化为十进制后除以2的y次方。具体示例如下:
#include <stdio.h>
int main() {
int x = 0b1010; // 十进制数为10
printf("x << 2 = %d\n", x << 2); // 输出:x << 2 = 40,等同于10 * (2 ^ 2)
printf("x >> 2 = %d\n", x >> 2); // 输出:x >> 2 = 2,等同于10 / (2 ^ 2)
return 0;
}
按位赋值运算符
按位赋值运算符既可以实现赋值操作,又可以同时进行位运算。C语言中的按位赋值运算符包括:
- &=
- |=
- ^=
- <<=
-
=
例如:
#include <stdio.h>
int main() {
int a = 0b1101; // a的二进制为1101
a &= 0b0011; // a的二进制为0001,相当于执行了a = a & 0b0011;
printf("a = %d\n", a); // 输出:a = 1
a |= 0b0100; // a的二进制为0101,相当于执行了a = a | 0b0100;
printf("a = %d\n", a); // 输出:a = 5
a ^= 0b1111; // a的二进制为0100,相当于执行了a = a ^ 0b1111;
printf("a = %d\n", a); // 输出:a = 10
a <<= 2; // a的二进制为101000,相当于执行了a = a << 2;
printf("a = %d\n", a); // 输出:a = 40
a >>= 1; // a的二进制为10100,相当于执行了a = a >> 1;
printf("a = %d\n", a); // 输出:a = 20
return 0;
}
示例说明
示例1:通过位运算打印一个整数的二进制表示
#include <stdio.h>
void print_binary(int x) {
int mask = 1 << sizeof(int) * 8 - 1;
for (int i = 0; i < sizeof(int) * 8; i++) {
if ((x & mask) == mask) {
printf("1");
} else {
printf("0");
}
mask >>= 1;
}
}
int main() {
int num = 0b11011011;
print_binary(num);
return 0;
}
以上代码的输出结果为:11011011
示例2:判断一个数是否为2的幂
#include <stdio.h>
int is_pow_of_two(int x) {
if (x == 0) {
return 0;
}
if ((x & (x - 1)) == 0) {
return 1;
}
return 0;
}
int main() {
int num = 16;
if (is_pow_of_two(num)) {
printf("%d是2的幂\n", num);
} else {
printf("%d不是2的幂\n", num);
}
return 0;
}
以上代码的输出结果为:16是2的幂
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C语言 位运算详解及示例代码 - Python技术站