###位運(yùn)算的邏輯:
1:(位與)運(yùn)算符(&):雙目操作符,當(dāng)兩個位進(jìn)行相與時仍翰,只有兩者都為“1”時結(jié)果才為“1”(即:全真為真赫粥,一假為假),運(yùn)算規(guī)則如下:
左運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ?右運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ?&運(yùn)算結(jié)果
? ? 0 ? ? ? ? ? ? ? ? ? ?& ? ? ? ? ? ? ? ?0 ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ?0
? ? 0 ? ? ? ? ? ? ? ? ? ?& ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ?0
? ? 1 ? ? ? ? ? ? ? ? ? ?& ? ? ? ? ? ? ? ? ?0 ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? 0
? ? 1 ? ? ? ? ? ? ? ? ? ?& ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? 1
運(yùn)算:
例:
#include ?<stdio.h>
int main(int ? ? argc,char ? ?*crgv[]){
? ? unsigned ? ? ? ? ? ?char ? ?x=0156, ? ?y=0xaf, ? z;
z=x&y;
printf("%d",z)
}
結(jié)果為:0x2e
運(yùn)算過程:0156(8進(jìn)制)==0000 0110 1110(2進(jìn)制)予借;
進(jìn)行 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?&(位與運(yùn)算)
? ? ? ? ? ? ? ? ? ? 0xaf(16進(jìn)制) ? ? ==0000 1010 ? ?1111(2進(jìn)制)越平;
結(jié)果:0000 ? ?0010 ? ?1110(2進(jìn)制)==0x2e(十六進(jìn)制)频蛔;
2:位或運(yùn)算符(|):
雙目操作符,當(dāng)兩個 位 ?進(jìn)行相或時秦叛,兩者中只要有一方為“1”晦溪,結(jié)果就為“1”(即:一真為真,兩假為假)挣跋,運(yùn)算規(guī)則如下:
? ? 左運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ? ? ?右運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ? ? (|) 運(yùn)算結(jié)果
? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ?0
? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ?1 ? ? ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ?1 ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?| ? ? ? ? ? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
例:
#include <stdio.h>
int main(int argv,char ?*argc[]){
unsigned char x=027,y=0x75;
z=x|y;
}
運(yùn)行過程:
027(8進(jìn)制)=0001 ? 0111(2進(jìn)制)
進(jìn)行 ? ? ? ? ? ? ? ? ? ?|(位或運(yùn)算)
0x75(16進(jìn)制)=0111 ? ?0101(2進(jìn)制)
結(jié)果:0111 ? 0111(2進(jìn)制)=0x77(16進(jìn)制)
3.異或運(yùn)算(^):
? ? 當(dāng)兩個位進(jìn)行異或時三圆,只要兩者相同,結(jié)果為“0”避咆,否者結(jié)果為“1”舟肉,(即:同假異真)運(yùn)算規(guī)則如下:
左運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ? ? ?右運(yùn)算量 ? ? ? ? ? ? ? ? ? ? ? ? ? (^) 運(yùn)算結(jié)果
? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ?^ ? ? ? ? ? ? ? ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ?0
? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?^ ? ? ? ? ? ? ? ? ? ?1 ? ? ? ? ? ? ? ? ? ? ? ? = ? ? ? ? ? ? ? ? ? ? ? ? ? ?0
? ? ? ? ? ? 0 ? ? ? ? ? ? ? ? ? ?^ ? ? ? ? ? ? ? ? ? ?1 ? ? ? ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ?1
? ? ? ? ? ? 1 ? ? ? ? ? ? ? ? ? ?^ ? ? ? ? ? ? ? ? ? ?0 ? ? ? ? ? ? ? ? ? ? ? ? ?= ? ? ? ? ? ? ? ? ? ? ? ? ? ? 1
例:
#include
int main(int argv,char ?*argc[]){
unsigned(無符號) ? ? char ? ?x=25,y=0263,z;
z=x^y;
printf("%d\n",z);
}
運(yùn)算過程:
25(十進(jìn)制)=0001 ? ?1001(二進(jìn)制)
運(yùn)算 ? ? ? ? ? ? ? ? ? ?^(異或運(yùn)算)
0263(8進(jìn)制)=1011 ? ?0011(二進(jìn)制)
結(jié)果:1010 ? ? 1010(二進(jìn)制)=0252(8進(jìn)制)
4:移位操作符(“<<” ? 或 ? ">>"):位移位運(yùn)算的一般形式:<運(yùn)算量><運(yùn)算符><表達(dá)式>;
<運(yùn)算量>必須為整型結(jié)果數(shù)值:
<運(yùn)算符>為左移位(<<)或 右移位(>>)運(yùn)算查库;
<表達(dá)式>也必須為整型結(jié)果數(shù)值路媚;
移位操作就是把一個數(shù)值左移或右移若干位;假如左移n位膨报,原來值最左邊的n位數(shù)被丟掉磷籍,右邊n衛(wèi)補(bǔ)“0” ;右移操作就是和左移操作移動方向相反现柠;
符號位的處理方法:
(1):邏輯移位院领,不考慮符號問題,原數(shù)值右移n位后够吩,左邊空出的n歌位置比然,用0填充;
(2):算術(shù)移位周循,原來值進(jìn)行了右移操作后强法,需要保證符號位不變,因此湾笛,右移n位后饮怯,左邊空出的n個位置,用原數(shù)值的符號位填充嚎研。原來若是負(fù)數(shù)蓖墅,則符號位為“1”,填充的位也是“1”临扮;原來若是正數(shù)论矾,則符號位為“0”,填充的位也是“0”杆勇,這樣保證移位后的數(shù)據(jù)與原數(shù)正負(fù)相同贪壳;
例:“1000 ? 1001”將其右移兩位,邏輯移位的結(jié)果為“0010 ?0010”蚜退,算術(shù)移位為:“1110 ?0010”闰靴;
將其左移兩位彪笼,邏輯移位和算術(shù)移位的結(jié)果為:“0010 ?0100”;
(3)***補(bǔ)充:特定位清零(由“1”變成“0”)用 位與 ?操作传黄;特定位變“1”(由“0”變成“1”)用 ?位或操作杰扫;
例:
a队寇、請把0xd5的第2位進(jìn)行清零操作
0xd5=1101 0101=>1101 0001
? ? 1111 1011
? ? ~0000 0100
? ? =0000 0001<<2
? ~(0x01<<2)&0xd5
b膘掰、請把0xed的第3位進(jìn)行清零操作
0xed=1110 1101=>1110 0101
? ? 1111 0111
? ? ~
? ? 0000 1000
=? ? 0000 0001<<3
? ? ~(0x01<<3)&0xed
c、請把0x7d的第2-4位進(jìn)行清零
0x7d=0111 1101=>0110 0001
? ? 1110 0011
? ? ~
? ? 0001 1100
=
? ? 0000 0111<<2
~(0x07)&0x7d
d佳遣、請把0x7d的第2位和第3位進(jìn)行清零
0x7d=0111 1101=>0111 0001
? ? 1111 0011
~
? ? 0000 1100
? ? 0000 0011<<2
~(0x03<<2)&0x7d
e识埋、請把0xc7的第4位進(jìn)行置1
0xc7=1100 0111=>1101 0111
? ? 0001 0000
? ? =0000 0001<<4
=~(0x01<<4)|0xc7
f、請把0x87的第3位進(jìn)行置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