美文网首页
2018-06-06位运算

2018-06-06位运算

作者: _未来_旅行者 | 来源:发表于2018-08-08 11:16 被阅读0次

    位运算

    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)

    AAKhH�~-(�

    相关文章

      网友评论

          本文标题:2018-06-06位运算

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