C语言|C语言 位运算

###位运算的逻辑:
1:(位与)运算符(&):双目操作符,当两个位进行相与时,只有两者都为“1”时结果才为“1”(即:全真为真,一假为假),运算规则如下:
左运算量右运算量&运算结果
0&0=0
0&1=0
1&0=0
1&1=1
运算:
例:
#include
int main(intargc,char*crgv[]){
unsignedcharx=0156,y=0xaf,z;
z=x&y;
printf("%d",z)
}
结果为:0x2e
运算过程:0156(8进制)==0000 0110 1110(2进制);
进行&(位与运算)
0xaf(16进制)==0000 10101111(2进制);
结果:000000101110(2进制)==0x2e(十六进制);


2:位或运算符(|):
双目操作符,当两个 位进行相或时,两者中只要有一方为“1”,结果就为“1”(即:一真为真,两假为假),运算规则如下:
左运算量右运算量(|) 运算结果
0|0=0
1|1=1
0|1=1
1|1=1
例:
#include
int main(int argv,char*argc[]){
unsigned char x=027,y=0x75;
z=x|y;
}
运行过程:
027(8进制)=00010111(2进制)
进行|(位或运算)
0x75(16进制)=01110101(2进制)
结果:01110111(2进制)=0x77(16进制)


3.异或运算(^):
当两个位进行异或时,只要两者相同,结果为“0”,否者结果为“1”,(即:同假异真)运算规则如下:
左运算量右运算量(^) 运算结果
0^0=0
1^1=0
0^1=1
1^0=1
例:
#include
int main(int argv,char*argc[]){
unsigned(无符号)charx=25,y=0263,z;
z=x^y;
printf("%d\n",z);
}
运算过程:
25(十进制)=00011001(二进制)
运算^(异或运算)
0263(8进制)=10110011(二进制)
结果:10101010(二进制)=0252(8进制)


4:移位操作符(“<<”或">>"):位移位运算的一般形式:<运算量><运算符><表达式>;
<运算量>必须为整型结果数值:
<运算符>为左移位(<<)或 右移位(>>)运算;
<表达式>也必须为整型结果数值;
移位操作就是把一个数值左移或右移若干位;假如左移n位,原来值最左边的n位数被丢掉,右边n卫补“0” ;右移操作就是和左移操作移动方向相反;
符号位的处理方法:
(1):逻辑移位,不考虑符号问题,原数值右移n位后,左边空出的n歌位置,用0填充;
(2):算术移位,原来值进行了右移操作后,需要保证符号位不变,因此,右移n位后,左边空出的n个位置,用原数值的符号位填充。原来若是负数,则符号位为“1”,填充的位也是“1”;原来若是正数,则符号位为“0”,填充的位也是“0”,这样保证移位后的数据与原数正负相同;
例:“10001001”将其右移两位,逻辑移位的结果为“00100010”,算术移位为:“11100010”;
将其左移两位,逻辑移位和算术移位的结果为:“00100100”;
【C语言|C语言 位运算】(3)***补充:特定位清零(由“1”变成“0”)用 位与操作;特定位变“1”(由“0”变成“1”)用位或操作;
例:
a、请把0xd5的第2位进行清零操作
0xd5=1101 0101=>1101 0001
1111 1011
~0000 0100
=0000 0001<<2
~(0x01<<2)&0xd5
b、请把0xed的第3位进行清零操作
0xed=1110 1101=>1110 0101
1111 0111
~
0000 1000
=0000 0001<<3
~(0x01<<3)&0xed
c、请把0x7d的第2-4位进行清零
0x7d=0111 1101=>0110 0001
1110 0011
~
0001 1100
=
0000 0111<<2
~(0x07)&0x7d
d、请把0x7d的第2位和第3位进行清零
0x7d=0111 1101=>0111 0001
1111 0011
~
0000 1100
0000 0011<<2
~(0x03<<2)&0x7d
e、请把0xc7的第4位进行置1
0xc7=1100 0111=>1101 0111
0001 0000
=0000 0001<<4
=~(0x01<<4)|0xc7
f、请把0x87的第3位进行置1
0x87=1000 0111=>1000 1111
0000 1000
~(0x01<<3)|0x87
g、请把0xc7的第3—5位置1
0xc7=1100 0111=>1111 1111
0011 1000
0000 0111<<3
~(0x07<<3)|0x87

    推荐阅读