1. 什么是位运算符?
位运算符在位级别执行数据操作。这些运算符还执行从右到左的位移位,或从左到右的位移位。按位运算符不适用于 float 或 double、long double、void 等。
下列表格列出六个位运算符
运算符 | 描述 | 规则 |
---|---|---|
& | 按位与 | 若两个相应额二进制位都为1,则该位的结果为1,否则为0 |
| | 按位或 | 两个相应的二进制位中只要有一个为1,则该位的结果为1,否则为0 |
^ | 按位异或 (XOR) | 若两个二进制位相同,则结果为0,不同则为1 |
~ | 按位反 (NOT) | 按位取反,即0变1,1变0 |
>> | 右移 | 将一个数的二进制位全部右移若干位。不同系统下右移的结果不同。 |
<< | 左移 | 将一个数的二进制位全部左移若干位,左移1位相当于乘2,左移n位,相当于乘2的n次方 |
说明:
(1).位运算符中除“~”以外,均为双目运算符,即要求两侧各有一个运算量
(2).运算量只能是整型或字符型数据,不能为实型数据
2. 位运算符真值表
&、 | 和 ^ 的真值表如下所示:
a | b | a & b | a | b | a ^ b |
---|---|---|---|---|
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 1 |
1 | 0 | 0 | 1 | 1 |
1 | 1 | 1 | 1 | 0 |
3. 位运算符>> 右移和左移运算符
下表说明了按位运算符左移和右移的移法:
1 2 3 4 |
a = 00010000 b = 2 a << b = 01000000 a >> b = 00000100 |
在 a << b 的情况下, 00010000 向左移动 2 位,并在最右边添加额外的零,因此该值变为 01000000 ;
对于 a >> b,从右边移了 2 位,因此从右边去除了两个零,在左边添加了两个零,因此该值变为 00000100
请注意,移位不像旋转那样工作,这意味着移位的位不会添加到另一端。移位的位的值丢失了。
4. 按位取反运算符
1的补码运算符,也称为按位取反运算符,将操作数中的所有 1 变为 0,并将所有 0 变为 1。
例如,如果原始字节为 00101100,则补码后将变为 11010011。
例1. 我们通过下例理解按位取反运算符
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
#include <stdio.h> int main() { int a = 0001000, b = 2, result; printf("a=%d | b=%d\n",a,b); // << result = a<<b; printf("a << b = %d \n",result); // >> result = a>>b; printf("a >> b = %d \n",result); return 0; } |
结果
1 2 3 |
a=512 | b=2 a << b = 2048 a >> b = 128 |
例2. 按位运算符举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
// C Program to demonstrate use of bitwise operators #include <stdio.h> int main() { // a = 5(00000101), b = 9(00001001) unsigned char a = 5, b = 9; // The result is 00000001 printf("a = %d, b = %d\n", a, b); printf("a&b = %d\n", a & b); // The result is 00001101 printf("a|b = %d\n", a | b); // The result is 00001100 printf("a^b = %d\n", a ^ b); // The result is 11111010 printf("~a = %d\n", a = ~a); // The result is 00010010 printf("b<<1 = %d\n", b << 1); // The result is 00000100 printf("b>>1 = %d\n", b >> 1); return 0; } |
结果
1 2 3 4 5 6 7 |
a = 5, b = 9 a&b = 1 a|b = 13 a^b = 12 ~a = 250 b<<1 = 18 b>>1 = 4 |
注意:左移和右移运算符不能用于负数运算
从技术面的角度来看,按位异或运算符是最有用的运算符。它被用于许多问题。
一个简单的例子是“给定一组数字,其中除一个数字外,所有元素都出现偶数次,找出出现奇数的数字”.
这个问题可以通过对所有数字进行异或来有效解决。
例3:按位异或运算符举例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
// C program to print map of India #include <stdio.h> // Function to return the only odd // occurring element int findOdd(int arr[], int n) { int res = 0, i; for (i = 0; i < n; i++) res ^= arr[i]; return res; } // Driver Method int main(void) { int arr[] = { 12, 12, 14, 90, 14, 14, 14 }; printf("sizeof arr: %d\n", sizeof(arr)); printf("sizeof arr[0]:%d\n", sizeof(arr[0])); int n = sizeof(arr) / sizeof(arr[0]); printf("The odd occurring element is %d ", findOdd(arr, n)); return 0; } |
结果:
1 2 3 |
sizeof arr: 28 sizeof arr[0]:4 The odd occurring element is 90 |
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!