王剑编程网

分享专业编程知识与实战技巧

C语言位运算的高级玩法,6个样例代码告诉你怎么玩,绝对干货

C语言的位运算符在处理二进制数据和位掩码时非常有用。以下是一些巧妙的计算代码,展示了位运算符的灵活应用:

1.计算绝对值: 这个例子演示了如何使用位运算计算一个整数的绝对值,避免使用条件语句和乘法。它的原理是利用了补码表示中,负数的绝对值为取反加1。

Bash
int num = -10;
int mask = num >> (sizeof(int) * CHAR_BIT - 1); // 得到符号位的扩展
int absValue = (num + mask) ^ mask; // 计算绝对值
printf("Absolute value of %d is %d\n", num, absValue);

输出为:Absolute value of -10 is 10

2.求两个数的平均值: 这个例子使用位运算求两个整数的平均值,避免整数溢出。它的原理是利用了两个数的和除以2等于右移1位的特性。

Bash
int a = 5, b = 7;
int average = (a & b) + ((a ^ b) >> 1);
printf("Average of %d and %d is %d\n", a, b, average);

输出为:Average of 5 and 7 is 6

3.数组中唯一出现一次的数字: 这个例子演示了如何找出数组中唯一出现一次的数字,其他数字都出现两次。它的原理是利用异或运算的特性,相同的数异或结果为0,任何数与0异或结果为其本身。

Bash
int arr[] = {4, 2, 3, 4, 2};
int n = sizeof(arr) / sizeof(arr[0]);
int uniqueNum = 0;
for (int i = 0; i < n; i++) {
    uniqueNum ^= arr[i];
}
printf("The unique number is %d\n", uniqueNum);

输出为:The unique number is 3

4.判断两个数是否异号: 这个例子使用位运算判断两个整数是否异号,即一个为正数,一个为负数。它的原理是利用了两个数异号时它们的符号位不同。

Bash
int x = -5, y = 10;
int sign = (x ^ y) >> (sizeof(int) * CHAR_BIT - 1);
if (sign) {
    printf("Numbers are of opposite signs.\n");
} else {
    printf("Numbers are of the same sign.\n");
}

输出为:Numbers are of opposite signs.

5.计算乘法: 这个例子使用位运算计算两个整数的乘法,避免使用乘法操作符。它的原理是利用了乘法可以表示为多个加法的性质。

Bash
int a = 6, b = 7;
int result = 0;
while (b) {
    if (b & 1) {
        result += a;
    }
    a <<= 1 b>>= 1;
}
printf("Product of %d and %d is %d\n", a, b, result);

输出为:Product of 0 and 3 is 42

6.交换两个数的值(进阶版): 这个例子使用位运算符(^)和加法减法来交换两个整数的值,避免数值溢出的问题。它的原理是利用异或运算的性质:a ^ a = 0 和 a ^ 0 = a。

Bash
int a = 5, b = 10;
a = a ^ b;
b = a ^ b;
a = a ^ b;
printf("a = %d, b = %d\n", a, b);

让我们用a=5、b=10来演示交换过程:

  • 初始:a=5,b=10
  • 第一步:a = 5 ^ 10,此时a为15,b不变
  • 第二步:b = 15 ^ 10,此时b为5,a为15
  • 第三步:a = 15 ^ 5,此时a为10,b为5
  • 交换完成:a=10,b=5

这些例子展示了位运算的高级应用,利用了位运算的性质进行一些复杂的计算。它们在一些特定场景下可以提高代码的效率和性能。

控制面板
您好,欢迎到访网站!
  查看权限
网站分类
最新留言