位运算
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�~-(�