位运算

Ps:位运算符是指进行二进制的运算。C语言中提供的位运算包括,与(&)、或(|)、异或(^)、取反(~)、移动(“<<”或“>>”)这些逻辑。

[if !supportLists]1、[endif]位于运算的的逻辑:

与运算符(&):

当两个位进行相与是,只有两者都为“1”时结果才为“1”,其他都为“0”。&和&&相似两边都要满足“1”时才有结果,其他的都为“0”。

例如:0x8a & 0x45

         0x8a = 1000 1010

&

0x45 = 0100 0101

结果为 0000 0000,转化为16进制等于 0x00。

实例:     0x5d & 0x7c = 0x5c

0x79 & 0xa3 = 0x21

0xe2 & 0x83 = 0x82。


如果遇到八进制,那么将八进制转化为二进制进行计算,差的位数就往最前面补零。

         例如:0xe3 &025 

                   0xe3= 1110 0011

                    025 = 0001 0101

                   结果就为0000 0001,转化为十六进制等于0x01。



或运算符(|)

当两位进行相或时,两者中只要有一方为“1”,结果就为“1”,其他都为“0”,注意:位或是一个|,两个||是逻辑或。例:1|0 = 1  1|0 = 1  0|0 =0 0|1 = 1。

         例如:0x2b |0xf7

                   0x2b= 0010 1011

                   0xf7= 1111 0111

                   结果为1111 1111,转化为十六进制等于0xff

如果与(&)和或(|)同时运用,按照运算符优先级计算,有括号的先算括号里面的。

         例如:0xd3&(0xad | 057) = 0x83

                     0x43 |(0x62 & 0x7d) = 0x63


异或运算符(^)

当两个位进行异或时,两者相同皆为“0”,否则结果就为“1”。

         例如:0x6a ^0xf4

                    0x6a = 0110 1010

                    0xf4 = 1111 0100

                   结果为1001 1110,转化为十六进制等于0x9e。

注意:如下面列题所示,那么要先遵守(运算符优先级)。

         例1:0x68 & (0x3c^ 0x45)= 0x68

例2:0xe3 |(0x37^0xa6) = 0xf3




按位取反运算(~)

取反运算符(~),按二进制数计算,逐个取反(“0”变“1”,“1”变“0”)。

注:逻辑取反是真(在c语言中只要不是“0”的任何数都为真)变为假(只有“0”表示假)、假就变为真。

例如:

~0x9d --> 1001 1101 取反得 0110 0010转化为十六进制为0x62

~0xa4 --> 1010 0100 取反得 0101 1011转为十六进制为0x5b

         ~0xc3 --> 1100 0011 取反得0011 1100转为十六进制为0x3c。



左移(<<)

左移运算符(<<),用来把各个二进制数全部向左移动N个位,注意(高位丢弃,低位补“0”)。

                   例如:0x23 进行左移2位

                   拆解为二进制:00000000 0010 0011

                   高位丢弃:(00)0000 00100011

                   低位补零:00000000 1000 1100

                   表达式为:(0x23<<2)

                                                                           注:高位丢弃多少位,低位补上多少零。

右移(>>)

右移运算符(>>),用来把各个二进制数全部右移N个单位,低位丢弃,高位补“0”或是“1”。

                   例如:0x7e 进行右移2位

                   拆解为二进制:00000000 0111 1110

                   高位补零:(00)0000 0000 01111110

                   低位丢弃:     0000 0000 0111 1100(10 丢弃)

                   表达式为:0x7e<<2

                                                        注:低位丢弃,高位补零。如果最高位是“1”,那么就补“1”。


重点:

特定位清零时,用位与(&)计算。

例1:把0x7d的第2位和第3位进行清零,求表达式。注(第几位都是以下标的形式计算),步骤如下:

                    1、 0x7d拆分为二进制:0111 1100

                    2、    提出清零的数:0000 1100

                    3、            取反:1111 0011

                    1和3进行位与(&)得到结果:0111 0000

                    那么表达式就为:0x7d

&~(0x3<<2)。                



特定位置“1”时,用位或(|)计算。

                  口诀:清零取反要用与(&),某位置“1”要用或(|),

                             若要取反和交换,轻轻松松用异或(^)。

                            例1:把0xc7的第3—5位置1,求表达式。

                                     1、0xc7拆分为二进制数:1100 0111

                                     2、  提出置“1”的数:0011 1000

                                     1和2进行位或(|)得到结果:1111 1111

                                     那么表达式就为:0xc7 | (0x7<<3)

你可能感兴趣的:(位运算)