C语言 位运算

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;
}

运行结果:


猜你喜欢

转载自blog.csdn.net/nanfeibuyi/article/details/80802944
今日推荐