c的位操作
一、位的概念
我們知道,在計(jì)算機(jī)中,一字節(jié)占8位(現(xiàn)在的某些電腦也有占16位的),這樣表示的數(shù)的范圍為0-255,
也即00000000-11111111。位就是里面的0和1。
char c=100;
實(shí)際上c應(yīng)該是01100100,正好是64H。其中高位在前,低位在后。
| |
第7位 第0位
二、位邏輯運(yùn)算符
符號(hào) 描述
& 按位與
| 按位或
^ 按位異或
~ 按位取反
表中除去最后一個(gè)運(yùn)算符是單目運(yùn)算符,其他都是雙目運(yùn)算符。這些運(yùn)算符只能用于整型表達(dá)式。位邏輯運(yùn)算符通常用于對(duì)整型變量進(jìn)行位的設(shè)置、清零、取反、以及對(duì)某些選定的位進(jìn)行檢測(cè)。在程序中一般被程序員用來(lái)作為開(kāi)關(guān)標(biāo)志。較低層次的硬件設(shè)備驅(qū)動(dòng)程序,經(jīng)常需要對(duì)輸入輸出設(shè)備進(jìn)行位操作。
& 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位都為1時(shí),結(jié)果為1,否則為0;
| 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位都為0時(shí),結(jié)果為0,否則為1;
^ 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位相同時(shí),結(jié)果為0,否則為1;
~ 運(yùn)算的規(guī)則是當(dāng)為1時(shí)結(jié)果為0,當(dāng)為0時(shí)結(jié)果為1。
1. 按位與運(yùn)算 按位與運(yùn)算符"&"是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與。只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1 ,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。
例如:9&5可寫(xiě)算式如下:?
00001001 (9的二進(jìn)制補(bǔ)碼)&00000101 (5的二進(jìn)制補(bǔ)碼)
00000001 (1的二進(jìn)制補(bǔ)碼)可見(jiàn)9&5=1。
按位與運(yùn)算通常用來(lái)對(duì)某些位清0或保留某些位
例如:把a(bǔ) 的高八位清 0 , 保留低八位,?
可作 a&255 運(yùn)算 ( 255 的二進(jìn)制數(shù)為0000000011111111)。
應(yīng)用:
a. 清零特定位 (mask中特定位置0,其它位為1,s=s&mask)
b. 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask)
2. 按位或運(yùn)算 按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或。只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。
例如:9|5可寫(xiě)算式如下:
00001001|00000101
00001101 (十進(jìn)制為13)可見(jiàn)9|5=13
應(yīng)用:
常用來(lái)將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask)
3. 按位異或運(yùn)算 按位異或運(yùn)算符“^”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn),
例如:9^5可寫(xiě)成算式如下:
00001001^00000101 00001100 (十進(jìn)制為12)
應(yīng)用:
a.?使特定位的值取反?(mask中特定位置1,其它位為0 s=s^mask)
b.?不引入第三變量,交換兩個(gè)變量的值?(設(shè) a=a1,b=b1)
目標(biāo)操作操作后狀態(tài)
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
4. 求反運(yùn)算 求反運(yùn)算符~為單目運(yùn)算符,具有右結(jié)合性。 其功能是對(duì)參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。
例如:~9的運(yùn)算為:?
~(0000000000001001)結(jié)果為:1111111111110110
三、位移運(yùn)算符
符號(hào) 描述
<< 左移
>> 右移
5. 左移運(yùn)算 左移運(yùn)算符“<<”是雙目運(yùn)算符。其功能把“<< ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動(dòng)的位數(shù),?高位丟棄,低位補(bǔ)0。 其值相當(dāng)于乘2。
例如: a<<4 指把a(bǔ)的各二進(jìn)位向左移動(dòng)4位。
如a=00000011(十進(jìn)制3),左移4位后為00110000(十進(jìn)制48)。
6. 右移運(yùn)算 右移運(yùn)算符“>>”是雙目運(yùn)算符。其功能是把“>> ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動(dòng)的位數(shù)。其值相當(dāng)于除2。
例如:設(shè) a=15,a>>2 表示把000001111右移為00000011(十進(jìn)制3)。
對(duì)于左邊移出的空位,如果是正數(shù)則空位補(bǔ)0,若為負(fù)數(shù),可能補(bǔ)0或補(bǔ)1,這取決于所用的計(jì)算機(jī)系統(tǒng)。移入0的叫邏輯右移,移入1的叫算術(shù)右移,Turbo C采用邏輯右移。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d b=%d ",a,b);
}
舉例:輸入一個(gè)整數(shù),判斷這個(gè)數(shù)中有幾個(gè)二進(jìn)制位1?例如輸入67,輸出結(jié)果應(yīng)該為3。因?yàn)?7的相應(yīng)二進(jìn)制數(shù)為00000000 01000011(0043H),有3個(gè)1出現(xiàn)。
分析:要判斷是不是1,只需要判斷該位與1與以后是不是1就可以知道。一個(gè)整數(shù),判斷16次即可。
int main(int argc, char *argv[])
{
int num, i, cnt = 0;
scanf("%d", &num);
for(i = 0; i < 16; i++)
{
if(num & 1 == 1) /* 判斷最低位是不是1 */
cnt++;?
num >>= 1; /* num右移1位 */
}
printf("%d\n", cnt);
return 0;
}
這樣每次都判斷最低位是不是1,判斷完以后,讓前面的右移一位即可。 注:文章轉(zhuǎn)自http://blog.chinaunix.net/uid-26495963-id-3065899.html
我們知道,在計(jì)算機(jī)中,一字節(jié)占8位(現(xiàn)在的某些電腦也有占16位的),這樣表示的數(shù)的范圍為0-255,
也即00000000-11111111。位就是里面的0和1。
char c=100;
實(shí)際上c應(yīng)該是01100100,正好是64H。其中高位在前,低位在后。
| |
第7位 第0位
二、位邏輯運(yùn)算符
符號(hào) 描述
& 按位與
| 按位或
^ 按位異或
~ 按位取反
表中除去最后一個(gè)運(yùn)算符是單目運(yùn)算符,其他都是雙目運(yùn)算符。這些運(yùn)算符只能用于整型表達(dá)式。位邏輯運(yùn)算符通常用于對(duì)整型變量進(jìn)行位的設(shè)置、清零、取反、以及對(duì)某些選定的位進(jìn)行檢測(cè)。在程序中一般被程序員用來(lái)作為開(kāi)關(guān)標(biāo)志。較低層次的硬件設(shè)備驅(qū)動(dòng)程序,經(jīng)常需要對(duì)輸入輸出設(shè)備進(jìn)行位操作。
& 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位都為1時(shí),結(jié)果為1,否則為0;
| 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位都為0時(shí),結(jié)果為0,否則為1;
^ 運(yùn)算的規(guī)則是當(dāng)兩個(gè)位相同時(shí),結(jié)果為0,否則為1;
~ 運(yùn)算的規(guī)則是當(dāng)為1時(shí)結(jié)果為0,當(dāng)為0時(shí)結(jié)果為1。
1. 按位與運(yùn)算 按位與運(yùn)算符"&"是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相與。只有對(duì)應(yīng)的兩個(gè)二進(jìn)位均為1時(shí),結(jié)果位才為1 ,否則為0。參與運(yùn)算的數(shù)以補(bǔ)碼方式出現(xiàn)。
例如:9&5可寫(xiě)算式如下:?
00001001 (9的二進(jìn)制補(bǔ)碼)&00000101 (5的二進(jìn)制補(bǔ)碼)
00000001 (1的二進(jìn)制補(bǔ)碼)可見(jiàn)9&5=1。
按位與運(yùn)算通常用來(lái)對(duì)某些位清0或保留某些位
例如:把a(bǔ) 的高八位清 0 , 保留低八位,?
可作 a&255 運(yùn)算 ( 255 的二進(jìn)制數(shù)為0000000011111111)。
應(yīng)用:
a. 清零特定位 (mask中特定位置0,其它位為1,s=s&mask)
b. 取某數(shù)中指定位 (mask中特定位置1,其它位為0,s=s&mask)
2. 按位或運(yùn)算 按位或運(yùn)算符“|”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相或。只要對(duì)應(yīng)的二個(gè)二進(jìn)位有一個(gè)為1時(shí),結(jié)果位就為1。參與運(yùn)算的兩個(gè)數(shù)均以補(bǔ)碼出現(xiàn)。
例如:9|5可寫(xiě)算式如下:
00001001|00000101
00001101 (十進(jìn)制為13)可見(jiàn)9|5=13
應(yīng)用:
常用來(lái)將源操作數(shù)某些位置1,其它位不變。 (mask中特定位置1,其它位為0 s=s|mask)
3. 按位異或運(yùn)算 按位異或運(yùn)算符“^”是雙目運(yùn)算符。其功能是參與運(yùn)算的兩數(shù)各對(duì)應(yīng)的二進(jìn)位相異或,當(dāng)兩對(duì)應(yīng)的二進(jìn)位相異時(shí),結(jié)果為1。參與運(yùn)算數(shù)仍以補(bǔ)碼出現(xiàn),
例如:9^5可寫(xiě)成算式如下:
00001001^00000101 00001100 (十進(jìn)制為12)
應(yīng)用:
a.?使特定位的值取反?(mask中特定位置1,其它位為0 s=s^mask)
b.?不引入第三變量,交換兩個(gè)變量的值?(設(shè) a=a1,b=b1)
目標(biāo)操作操作后狀態(tài)
a=a1^b1 a=a^b a=a1^b1,b=b1
b=a1^b1^b1 b=a^b a=a1^b1,b=a1
a=b1^a1^a1 a=a^b a=b1,b=a1
4. 求反運(yùn)算 求反運(yùn)算符~為單目運(yùn)算符,具有右結(jié)合性。 其功能是對(duì)參與運(yùn)算的數(shù)的各二進(jìn)位按位求反。
例如:~9的運(yùn)算為:?
~(0000000000001001)結(jié)果為:1111111111110110
三、位移運(yùn)算符
符號(hào) 描述
<< 左移
>> 右移
5. 左移運(yùn)算 左移運(yùn)算符“<<”是雙目運(yùn)算符。其功能把“<< ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部左移若干位,由“<<”右邊的數(shù)指定移動(dòng)的位數(shù),?高位丟棄,低位補(bǔ)0。 其值相當(dāng)于乘2。
例如: a<<4 指把a(bǔ)的各二進(jìn)位向左移動(dòng)4位。
如a=00000011(十進(jìn)制3),左移4位后為00110000(十進(jìn)制48)。
6. 右移運(yùn)算 右移運(yùn)算符“>>”是雙目運(yùn)算符。其功能是把“>> ”左邊的運(yùn)算數(shù)的各二進(jìn)位全部右移若干位,“>>”右邊的數(shù)指定移動(dòng)的位數(shù)。其值相當(dāng)于除2。
例如:設(shè) a=15,a>>2 表示把000001111右移為00000011(十進(jìn)制3)。
對(duì)于左邊移出的空位,如果是正數(shù)則空位補(bǔ)0,若為負(fù)數(shù),可能補(bǔ)0或補(bǔ)1,這取決于所用的計(jì)算機(jī)系統(tǒng)。移入0的叫邏輯右移,移入1的叫算術(shù)右移,Turbo C采用邏輯右移。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d b=%d ",a,b);
}
舉例:輸入一個(gè)整數(shù),判斷這個(gè)數(shù)中有幾個(gè)二進(jìn)制位1?例如輸入67,輸出結(jié)果應(yīng)該為3。因?yàn)?7的相應(yīng)二進(jìn)制數(shù)為00000000 01000011(0043H),有3個(gè)1出現(xiàn)。
分析:要判斷是不是1,只需要判斷該位與1與以后是不是1就可以知道。一個(gè)整數(shù),判斷16次即可。
int main(int argc, char *argv[])
{
int num, i, cnt = 0;
scanf("%d", &num);
for(i = 0; i < 16; i++)
{
if(num & 1 == 1) /* 判斷最低位是不是1 */
cnt++;?
num >>= 1; /* num右移1位 */
}
printf("%d\n", cnt);
return 0;
}
這樣每次都判斷最低位是不是1,判斷完以后,讓前面的右移一位即可。 注:文章轉(zhuǎn)自http://blog.chinaunix.net/uid-26495963-id-3065899.html
總結(jié)
- 上一篇: 2021数字化就业新职业新岗位研究报告
- 下一篇: 通宵加班的产品经理,为什么我不建议你买保