C语言:位运算符—-与(&),或(|),非(~),异或(^),左移(<<)和右移(>>)
•
编程语言
C语言 基础开发—-目录
一、位运算符—-简介
位运算符 就是按二进制位进行运算。
C语言中位运算符主要包括六种,具体如下:
与(&),或(|),非(~),异或(^),左移(<>)
| 位运算符 | 含义 | 说明 |
|---|---|---|
| & | 按位与 | 有0为0,双1为1: 1&1=1,1&0=0,0&1=0,0&0=0 只有两者对应位都为1,结果对应位才为 1,否则为 0 |
| I | 按位或 | 有1为1,双0为0: 1I1=1,1I0=1,0I1=1,0I0=0 只要两者对应位有一个为1,则结果对应位就为 1,否则为 0 |
| ~ | 按位取反 | 1变0,0变1: ~1=0, ~0=1 如果该位为 1,则结果对应位为 0 如果该位为 0, 则结果对应位为 1 |
| ^ | 按位异或 | 不同为1,相同为0: 1^1=0, 1^0=1, 0^1=1, 0^0=0 只有两者对应位不一样,则结果对应位才为 1, 否则为 0 |
| << | 左移 | 左移n位就是乘以2的n次方 所有位依次向左移动,高位丢弃,低位补0 |
| >> | 右移 | 右移n位就是除以2的n次方 无符号数据:所有位依次向右移动,高位补0,低位丢弃 有符号数据:所有位依次向右移动,符号位不变,低位丢弃 |
二、位运算符—-详细说明
1. 位与运算(&):有0为0,双1为1
只有两者对应位都为1,结果对应位才为 1,否则为 0。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x03 | 0000 0011 |
| b | 0x0A | 0000 1010 |
| a&b | 0x02 | 0000 0010 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x03,b=0x0A;
printf("a=0x%X\n",a);
printf("b=0x%X\n",b);
printf("a&b=0x%X\n",a&b);
return 0;
}
运行结果如下:

2. 位或运算(|):有1为1,双0为0
只要两者对应位有一个为1,则结果对应位就为 1,否则为 0。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x03 | 0000 0011 |
| b | 0x0A | 0000 1010 |
| aIb | 0x0B | 0000 1011 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x03,b=0x0A;
printf("a=0x%X\n",a);
printf("b=0x%X\n",b);
printf("a|b=0x%X\n",a|b);
return 0;
}
运行结果如下:

3. 位取反运算(~):1变0,0变1
如果该位为 1,则结果对应位为 0。
如果该位为 0, 则结果对应位为 1。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x03 | 0000 0011 |
| ~a | 0xFC | 1111 1100 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x03,b=~a;
printf("a=0x%X\n",a);
printf("b=0x%X\n",b);
return 0;
}
运行结果如下:

4. 位异或运算(^):不同为1,相同为0
只有两者对应位不一样,则结果对应位才为 1, 否则为 0。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x03 | 0000 0011 |
| b | 0x0A | 0000 1010 |
| a^b | 0x09 | 0000 1001 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x03,b=0x0A;
printf("a=0x%X\n",a);
printf("b=0x%X\n",b);
printf("a^b=0x%X\n",a^b);
return 0;
}
运行结果如下:

5. 左移运算(<<)
所有位依次向左移动,高位丢弃,低位补0。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x03 | 0000 0011 |
| a<<2 | 0x0C | 0000 1100 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x03;
printf("a=0x%X\n",a);
printf("a<<2=0x%X\n",a<<2);
return 0;
}
运行结果如下:

6. 右移运算(>>)
无符号数据:所有位依次向右移动,高位补0,低位丢弃。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x083 | 1000 0011 |
| a>>1 | 0x41 | 0100 0001 |
举例说明:
#include
int main(int argc, char *argv[])
{
unsigned char a=0x83;
printf("a=0x%X\n",a);
printf("a>>1=0x%X\n",a>>1);
return 0;
}
运行结果如下:

有符号数据:所有位依次向右移动,符号位不变,低位丢弃。
| 变量 | 十六进制数值 | 二进制数 |
|---|---|---|
| a | 0x083 | 1000 0011 |
| a>>1 | 0xC1 | 1100 0001 |
举例说明:
#include
int main(int argc, char *argv[])
{
char a=0x83;
printf("a=0x%X\n",(unsigned char)a);
printf("a>>1=0x%X\n",(unsigned char)(a>>1));
return 0;
}
运行结果如下:

本文来自网络,不代表协通编程立场,如若转载,请注明出处:https://net2asp.com/009b224136.html
