本文目錄一覽:
c語言位運算是什麼?
運算:C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。
在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。
當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則就會顯得十分重要。
運算符號:
比較特別的是,比特右移()運算符可以是算術(左端補最高有效位)或是邏輯(左端補0)位移。
例如,將11100011右移3比特,算術右移後成為11111100,邏輯右移則為00011100。因算術比特右移較適於處理帶負號整數,所以幾乎所有的編譯器都是算術比特右移。
運算符的優先級從高到低大致是:單目運算符、算術運算符、關係運算符、邏輯運算符、條件運算符、賦值運算符(=)和逗號運算符。
c語言的按位運算符怎麼操作!?
位運算
在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能,
這使得C語言也能像彙編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
按位與
|
按位或
^
按位異或
~
取反
左移
右移
1.
按位與運算
按位與運算符””是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1
,否則為0。參與運算的數以補碼方式出現。
例如:95可寫算式如下:
00001001
(9的二進制補碼)00000101
(5的二進制補碼)
00000001
(1的二進制補碼)可見95=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a
的高八位清
,
保留低八位,
可作
a255
運算
(
255
的二進制數為0000000011111111)。
main(){
int
a=9,b=5,c;
c=ab;
printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);
}
2.
按位或運算
按位或運算符“|”是雙目運算符。其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如:9|5可寫算式如下:
00001001|00000101
00001101
(十進制為13)可見9|5=13
main(){
int
a=9,b=5,c;
c=a|b;
printf(“a=%d\nb=%d\nc=%d\n”,a,b,c);
}
3.
按位異或運算
按位異或運算符“^”是雙目運算符。其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。參與運算數仍以補碼出現,例如9^5可寫成算式如下:
00001001^00000101
00001100
(十進制為12)
main(){
int
a=9;
a=a^15;
printf(“a=%d\n”,a);
}
4.
求反運算
求反運算符~為單目運算符,具有右結合性。
其功能是對參與運算的數的各二進位按位求反。例如~9的運算為:
~(0000000000001001)結果為:1111111111110110
5.
左移運算
左移運算符“”是雙目運算符。其功能把“
”左邊的運算數的各二進位全部左移若干位,由“”右邊的數指定移動的位數,
高位丟棄,低位補0。例如:
a4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6.
右移運算右移運算符“”是雙目運算符。其功能是把“
”左邊的運算數的各二進位全部右移若干位,“”右邊的數指定移動的位數。
例如:設
a=15,a2
表示把000001111右移為00000011(十進制3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,
最高位補0,而為負數時,符號位為1,最高位是補0或是補1
取決於編譯系統的規定。Turbo
C和很多系統規定為補1。
main(){
unsigned
a,b;
printf(“input
a
number:
“);
scanf(“%d”,a);
b=a5;
b=b15;
printf(“a=%d\tb=%d\n”,a,b);
}
請再看一例!
main(){
char
a=’a’,b=’b’;
int
p,c,d;
p=a;
p=(p8)|b;
d=p0xff;
c=(p0xff00)8;
printf(“a=%d\nb=%d\nc=%d\nd=%d\n”,a,b,c,d);
}
c語言之中的位運算符是怎麼運算的呢?
所謂位,就是指將一個或兩個數轉換成二進制按每一位進行運算
位與
運算規則
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1
|位或
運算規則
0 | 0 = 0
0 | 1 = 1
1 | 0 = 1
1 | 1 = 1
^異或
運算規則
0 ^ 0 = 0
0 ^ 1 = 1
1 ^ 0 = 1
1 ^ 1 = 0
~取反
運算規則
將0變1
將1變0
左移
運算規則
左移n位,相當於給一個十進制數乘以2的n次方
右移
運算規則
右移n位,相當於給一個十進制數除以2的n次方
前三個是兩個二進制數之間的運算
後三個是一個二進制數自身的運算
C語言 位運算
###位運算的邏輯:
1:(位與)運算符():雙目操作符,當兩個位進行相與時,只有兩者都為“1”時結果才為“1”(即:全真為真,一假為假),運算規則如下:
左運算量 右運算量 運算結果
0 0 = 0
0 1 = 0
1 0 = 0
1 1 = 1
運算:
例:
#include stdio.h
int main(int argc,char *crgv[]){
unsigned char x=0156, y=0xaf, z;
z=xy;
printf(“%d”,z)
}
結果為:0x2e
運算過程:0156(8進制)==0000 0110 1110(2進制);
進行 (位與運算)
0xaf(16進制) ==0000 1010 1111(2進制);
結果:0000 0010 1110(2進制)==0x2e(十六進制);
2:位或運算符(|):
雙目操作符,當兩個 位 進行相或時,兩者中只要有一方為“1”,結果就為“1”(即:一真為真,兩假為假),運算規則如下:
左運算量 右運算量 (|) 運算結果
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;
}
運行過程:
027(8進制)=0001 0111(2進制)
進行 |(位或運算)
0x75(16進制)=0111 0101(2進制)
結果:0111 0111(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(無符號) char x=25,y=0263,z;
z=x^y;
printf(“%d\n”,z);
}
運算過程:
25(十進制)=0001 1001(二進制)
運算 ^(異或運算)
0263(8進制)=1011 0011(二進制)
結果:1010 1010(二進制)=0252(8進制)
4:移位操作符(“” 或 “”):位移位運算的一般形式:運算量運算符表達式;
運算量必須為整型結果數值:
運算符為左移位()或 右移位()運算;
表達式也必須為整型結果數值;
移位操作就是把一個數值左移或右移若干位;假如左移n位,原來值最左邊的n位數被丟掉,右邊n衛補“0” ;右移操作就是和左移操作移動方向相反;
符號位的處理方法:
(1):邏輯移位,不考慮符號問題,原數值右移n位後,左邊空出的n歌位置,用0填充;
(2):算術移位,原來值進行了右移操作後,需要保證符號位不變,因此,右移n位後,左邊空出的n個位置,用原數值的符號位填充。原來若是負數,則符號位為“1”,填充的位也是“1”;原來若是正數,則符號位為“0”,填充的位也是“0”,這樣保證移位後的數據與原數正負相同;
例:“1000 1001”將其右移兩位,邏輯移位的結果為“0010 0010”,算術移位為:“1110 0010”;
將其左移兩位,邏輯移位和算術移位的結果為:“0010 0100”;
(3)***補充:特定位清零(由“1”變成“0”)用 位與 操作;特定位變“1”(由“0”變成“1”)用 位或操作;
例:
a、請把0xd5的第2位進行清零操作
0xd5=1101 0101=1101 0001
1111 1011
~0000 0100
=0000 00012
~(0x012)0xd5
b、請把0xed的第3位進行清零操作
0xed=1110 1101=1110 0101
1111 0111
~
0000 1000
= 0000 00013
~(0x013)0xed
c、請把0x7d的第2-4位進行清零
0x7d=0111 1101=0110 0001
1110 0011
~
0001 1100
=
0000 01112
~(0x07)0x7d
d、請把0x7d的第2位和第3位進行清零
0x7d=0111 1101=0111 0001
1111 0011
~
0000 1100
0000 00112
~(0x032)0x7d
e、請把0xc7的第4位進行置1
0xc7=1100 0111=1101 0111
0001 0000
=0000 00014
=~(0x014)|0xc7
f、請把0x87的第3位進行置1
0x87=1000 0111=1000 1111
0000 1000
~(0x013)|0x87
g、請把0xc7的第3—5位置1
0xc7=1100 0111=1111 1111
0011 1000
0000 01113
~(0x073)|0x87
c語言的位符號 都是怎麼運算的啊
C語言提供的位運算符列表:
運算符
含義
描述
按位與
如果兩個相應的二進制位都為1,則該位的結果值為1,否則為0
|
按位或
兩個相應的二進制位中只要有一個為1,該位的結果值為1
^
按位異或
若參加運算的兩個二進制位值相同則為0,否則為1
~
取反
~是一元運算符,用來對一個二進制數按位取反,即將0變1,將1變0
左移
用來將一個數的各二進制位全部左移N位,右補0
右移
將一個數的各二進制位右移N位,移到右端的低位被捨棄,對於無符號數,高位補0
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/245392.html