Menu Close

C语言运算符:按位运算符

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

 

除教程外,本网站大部分文章来自互联网,如果有内容冒犯到你,请联系我们删除!

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Leave the field below empty!

Posted in C语言教程

Related Posts