C语言 位运算
一、简述
有时候利用位运算可提高运算效率。因为计算机的加减乘除就是依靠位运算实现的。
比如整数的运算:加法:通过异或、与、移位实现;减法:a-b其实就是a+(-b);乘法:5*3其实就是5+5+5;除法:7/2其实就是
用7不断减2,看看能够减几次,整数运算中,7/2结果为3。
用1字节(8位)举例
1、与运算
两个位都为1时,结果才为1。C语言中与运算的符号为"&",汇编中是"and"
比如 123&85 -->81
01111011 (123)
& 01010101 (85)
-------------------
01010001 (81)
2、或运算
只要有一个为1,结果就为1。 C语言中或运算的符号为"|",汇编中是"or"
比如 123|85-->127
01111011 (123)
| 01010101 (85)
-------------------
01111111 (127)
3、异或运算
不一样时结果为1。
只要有一个为1,结果就为1。C语言中异或运算的符号为"^",汇编中是"xor"
比如 123^85-->46
01111011 (123)
^ 01010101 (85)
-------------------
00101110 (46)
4、非运算
1变为0,0变为1。C语言中非运算的符号为"~",汇编中是"not"。
比如 ~123--->-124
~ 01111011 (123)
---------------------
10000100 (-124)注意10000100是一个负数的补码,反码为:10000011,原码为:11111100 (-124)
5、左移
各二进位全部左移若干位,高位丢弃,低位补0。C语言中左移运算的符号为"<<",汇编中是"shl"。
比如 23<<2 --->92
0001 0111左移两位变为:01 011100 (92)
6、右移
各二进位全部右移若干位,低位丢弃,高位补0或者补符号位。C语言中左移运算的符号为">>",汇编中是"shr"(无符号),"sar"(有符号)。
比如:
对于无符号数:高位补0
unsigned char ch= 10; //(00001010)
ch>>2 ---->00000010 (2)
对于有符号数:补符号位
char ch= -10; //(原码:10001010,反码:11110101:,补码:11110110) 注意负数存储的是补码。
ch>>2 ---->11111101 (-3)注意11111101是一个负数的补码,反码为:11111100,原码为:10000011 (-3)
二、程序验证
#include <stdio.h>
int main()
{
char ch123 = 123;
char ch85 = 85;
char ch23 = 23;
unsigned char num = 10;
char num2 = -10;
printf("123&85的结果是%d\n",ch123&ch85);
printf("123|85的结果是%d\n",ch123|ch85);
printf("123^85的结果是%d\n",ch123^ch85);
printf("~123的结果是%d\n",~ch123);
printf("23<<2的结果是%d\n",ch23<<2);
printf("num>>2的结果是%d\n",num>>2);
printf("num2>>2的结果是%d\n",num2>>2);
getchar();//等待一下
return 0;
}
运行结果: