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).运算量只能是整型或字符型数据,不能为实型数据
(3).位运算符的操作对象是数据所代表的补码
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. 位运算符>> 右移和左移运算符
下表说明了按位运算符左移和右移的移法:
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. 我们通过下例理解按位取反运算符
#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;
}
结果
a=512 | b=2
a << b = 2048
a >> b = 128
例2. 按位运算符举例
// 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;
}
结果
a = 5, b = 9
a&b = 1
a|b = 13
a^b = 12
~a = 250
b<<1 = 18
b>>1 = 4
注意:左移和右移运算符不能用于负数运算
从技术面的角度来看,按位异或运算符是最有用的运算符。它被用于许多问题。
一个简单的例子是“给定一组数字,其中除一个数字外,所有元素都出现偶数次,找出出现奇数的数字”.
这个问题可以通过对所有数字进行异或来有效解决。
例3:按位异或运算符举例
// 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;
}
结果:
sizeof arr: 28
sizeof arr[0]:4
The odd occurring element is 90
除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!