C语言位运算

作者: Mark_Ming | 来源:发表于2016-03-09 00:02 被阅读422次

C语言里位运算就是对一个比特(Bit)进行操作,比特(Bit)是计算机的一个电子元件,只有通电和断电两种状态(这也是为什么计算机会采用二进制进行运算,1代表通电,0代表不通电),8个比特构成一个字节(Byte),它是最小的可操作单位.

CoderDoctorLee

1.按位与运算 (&) :

        一个比特位只有0和1两个取值,只有运算符号&左右两边都为1时结果才为1,否则为0。例如1 & 1为1,0 & 0为0,1 & 0为0。数值在内存中以二进制的形式存在。9 & 5可写算式如下:                00001001(9的二进制) & 00000101 (5的二进制) = 00000001 (1的二进制) 所以 9 & 5 = 1。严格来说,数值在内存中以补码形式存在,整数的补码与它的二进制形式相同,负数则不一样。按位与运算符&会对参与运算的两个数的所有二进制位进行&运算。按位与运算通常用来对某些位清0或保留某些位。比如想把一个数字a的高16位清零,保留低16位,可以进行a & 65535运算(65535占用四个字节 二进制表示为00000000000000001111111111111111)。                

代码举例:                                                                                                                                  

unsigned int a = 9;//二进制:00001001

unsigned int b = 5;//二进制:00000101

unsigned int c = 0XDE09A32B;//十进制:3725173547

unsigned int d = 0X0000FFFF;//十进制:65535

printf("a=%u, b=%u, a&b=%u\n", a, b, a & b);

printf("c=%u, d=%u, c&d(%%d)=%u, c&d(%%X)=%X\n", c, d, c & d, c & d);

结果如下:

a = 9, b = 5, a & b = 1

c = 3725173547, d = 65535, c & d(%d) = 41771, c & d(%X) = A32B

2.按位或运算 (|):

              参与或运算|的两个二进制位有一个为1时,结果就为1,两个都为0时结果才为0。例如1|1为1,0|0为0,1|0为1。9|5可写算式如下:00001001 (9的二进制)    |    00000101(5的二进制)      = 00001101 (13的二进制)所以9|5=13。按位或运算可以用来将某些二进制位置为1,而保留某些位。

代码举例:

unsigned int a = 9;//二进制:00001001

unsigned int b = 5;//二进制:00000101

unsigned int c = 0XDE09A32B;//十进制:3725173547

unsigned int d = 0X0000FFFF;//十进制:65535

printf("a=%u, b=%u, a|b=%u\n", a, b, a | b);

printf("c=%u, d=%u, c|d(%%d)=%u, c|d(%%X)=%X\n", c, d, c | d, c | d);

结果如下:

a=9, b=5, a|b=13

c=3725173547, d=65535, c|d(%d)=3725197311, c|d(%X)=DE09FFFF

3.按位异或运算 (^): 

              按位异或运算参与异或运算^的两个二进制位不同时,结果为1,相同时结果为0。也就是说,0^1为1,0^0为0,1^1为0。9^5可写成算式如下: 00001001 (9的二进制)  ^ 00000101    (5的二进制)  =  00001100 (12的二进制),所以9 ^ 5 = 12。按位异或运算可以用来反转某些二进制位。

代码举例:

unsigned int a = 9;//二进制:00001001

unsigned int b = 5;//二进制:00000101

unsigned int c = 0XDE09A32B;//十进制:3725173547

unsigned int d = 0X0000FFFF;//十进制:65535

printf("a=%u, b=%u, a^b=%u\n", a, b, a ^ b);

printf("c=%u, d=%u, c^d(%%d)=%u, c^d(%%X)=%X\n", c, d, c^d, c^d);

结果如下:

a=9, b=5, a^b=12

c=3725173547, d=65535, c^d(%d)=3725155540, c^d(%X)=DE095CD4

4.取反运算 (~) :

               取反运算取反运算符~为单目运算符,右结合性,作用是对参与运算的数的各二进位按位取反。例如 ~1为0,~0为1。~9的运算为:~0000000000001001 = 1111111111110110所以~9=65526。

5.左移运算 (<<):

               左移运算左移运算符<<用来把操作数的各二进位全部左移若干位,高位丢弃,低位补0。例如:a=9;a<<3;<<左边是要移位的操作数,右边是要移动的位数。上面的代码表示把a的各二进位向左移动3位。a=00001001(9的二进制),左移3位后为01001000(十进制72)。

6.右移运算 (>>):

               右移运算右移运算符>>用来把操作数的各二进位全部右移若干位,低位丢弃,高位补0(或1)。例如:a=9;a>>3;表示把a的各二进位向右移动3位。a=00001001(9的二进制),右移3位后为00000001(十进制1)。


补充:

                需要注意的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译器的规定。

代码举例:

unsigned int c = 0X00FFFF00;//十进制: 3725173547

unsigned int d = 0XFFFF0000;//十进制: 65535

printf("c=%X, d=%X, c^d(%%X)=%X, c|d(%%X)=%X, c>>4=%X, c<<8=%X\n", c, d, c^d, c|d, c>>4, c<<8);

结果如下:

c=FFFF00, d=FFFF0000, c^d(%X)=FF00FF00, c|d(%X)=FFFFFF00, c>>4=FFFF0, c<<8=FFFF0000

相关文章

  • 巧妙运用C语言位运算

    巧妙运用C语言位运算,C语言是面向过程的,而C++是面向对象的 位运算 位运算的运算分量只能是整型或字符型数据,位...

  • C语言位运算

    C语言位运算_C语言中文网 C语言位域(位段)_C语言中文网

  • 16_位运算符分析

    关键词: C语言中的位运算符、 左移和右移注意点、位运算防错准则、 位运算符和逻辑运算符的区别 1. C语言中的位...

  • C语言 位运算

    ###位运算的逻辑: 1:(位与)运算符(&):双目操作符,当两个位进行相与时,只有两者都为“1”时结果才为“1”...

  • C语言位运算

    C语言里位运算就是对一个比特(Bit)进行操作,比特(Bit)是计算机的一个电子元件,只有通电和断电两种状态(这也...

  • c语言位运算

  • C语言:按位运算

    C语言:按位运算 C有这些按位运算的运算符& 按位的与| 按位的或~ 按位取反^ 按位的异或<< ...

  • 位运算

    位运算小结(按位与、按位或、按位异或、取反、左移、右移) 位运算不管是在Java语言,还是在C语言中,或者其他语言...

  • 嵌入式C语言的位运算

    想必大家都了解&&(且运算符),||(或运算符),在C语言的位运算中 ,位或运算|,位与运算&,异或^,取反~。等...

  • C 语言中的位级运算和 C 语言中的逻辑运算

    C 语言中的位级运算 C 语言的一个很有用的特性就是它支持按位布尔运算。事实上,我们在布尔运算中使用的那些符号就是...

网友评论

    本文标题:C语言位运算

    本文链接:https://www.haomeiwen.com/subject/rhbzkttx.html