當前位置:首頁 » 編程語言 » 位運算如何寫c語言表達式
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

位運算如何寫c語言表達式

發布時間: 2022-09-01 05:00:30

A. c語言中按位或,與,非是怎麼用的,怎麼運算

位運算符
C提供了六種位運算運算符;這些運算符可能只允許整型操作數,即char、short、int和long,無論signed或者unsigned。
&
按位AND
|
按位OR
^
按位異或
<<
左移
>>
右移
~
求反(一元運算)
按位與操作&通常用於掩去某些位,比如
n
=
n
&
0177;
使得n中除了低7位的各位為0。
按位或操作|用於打開某些位:
x
=
x
|
SET_ON;
使得x的某些SET_ON與相對的位變為1。
按位異或操作^使得當兩個操作數的某位不一樣時置該位為1,相同時置0。
應該區分位操作符&、|與邏輯操作符&&、||,後者從左到右的評價一個真值。比如,如果x為1、y為2,那麼x
&
y為0,而x
&&
y為1。
移位運算符<<和>>將左側的操作數左移或者右移右操作數給定的數目,右操作數必須非負。因此x
<<
2將x的值向左移動兩位,用0填充空位;這相當於乘4。右移一個無符號數會用0進行填充。右移一個帶符號數在某些機器上會用符號位進行填充(「算數移位」)而在其他機器上會用0進行填充(「邏輯移位」)。
單目運算符~對一個整數求反;即將每一個1的位變為0,或者相反。比如
x
=
x
&
~077
將x的後六位置0。注意x
&
~077的值取決於字長,因此比如如果假設x是16位數那麼就是x
&
0177700。這種簡易型式並不會造成額外開銷,因為~077是一個常數表達式,可以在編譯階段被計算。
作為一個使用位操作的實例,考慮函數getbits(x,p,n)。它返回以p位置開始的n位x值。我們假設0位在最右邊,n和p是正數。例如,getbits(x,4,3)返回右面的4、3、2位。
/*
getbits:
返回從位置p開始的n位
*/
unsigned
getbits(unsigned
x,
int
p,
int
n)
{
return
(x
>>
(p+1-n))
&
~(~0
<<
n);
}
表達式x
>>
(p+1-n)將需要的域移動到字的右側。~0是全1;將其左移n為並在最右側填入0;用~使得最右側n個1成為掩碼。

B. C語言中的位運算是怎樣的

如果你把所有的操作數都用二進制來表達就清晰了,如下

位與 & 相同位按與來運算即可 如:
1 & 2 =0
-------------
二進制是這樣的 01 & 10 = 00

位或 | 一樣,按位來或即可
1|2 = 3
--------------
二進制是這樣: 01|10=11

其他位運算都是按二進制位來運算的,你轉換成2進制就好理解了

C. c語言之中的位運算符是怎麼運算的呢

C語言提供了表12—1所列出的6種位運算符以及表12-2所列出的5種擴展運算符。
表12-1
運 算 符 含 義 優 先 級
~ 按位求反 高
<< 左移


>> 右移
& 按位與
^ 按位異或
| 按位或
表12-2
擴 展 運 算 符 表 達 式 等 價 的 表 達 式
<<= a<<=2 a=a<<2
>>= b>>=1 b=b>>1
&= a&=b a=a&b
^= a^=b a=a^b
|= a|=b a=a|b
【說明】
位運算符中,只有「反求」(~)是單目運算符,即要求運算符兩側各有一個運算量,其餘均為雙目運算符。
運算的運算對象只能是整形或字元型數據,不能是其他類型的數據,在VC 6.0中整形數據佔4個位元組,字元型數據佔1個位元組。
參與運算時,操作數都必須首先轉換成二進制形式,然後再執行相應的按位運算。
各雙目運算符與賦值運算符結合可以組成擴展的賦值運算符,見表12-2.

12.2 位運算符詳解
12.2.1 按位與運算
按位與運算「&」的運算格式:
操作數1&操作數2
【說明】
其中「操作數1」和操作數「2」必須是整型或字元型數據。
按位與運算規則是:當參加運算的2個二進制數的對應位都為1,則該位的結果為1,否則為0,即0&0=0,0&1=0,1&0=0,1&1=1。
【例如】
4&5的運算如下:
00000100 (4)
(&) 00000101 (5)
00000100 (4)
因此,4&5的值為4。
可以利用按位與運算來實現一些特定的功能,下面介紹幾種常見的功能。
清零
如果想將一個數的全部二進制置為零,只要找一個二進制數,其中個個位要符合以下條件:原來的數中為1的位,新數中相應的位為0。然後使二者進行按位與運算即可達到清零的目的。

【例如】
原有數為171,其二進制形式為10101011,另找一個數,設它為00010100,它符合以上條件,即在原數為1的位置上,它的位值均為0。將兩個數進行&運算:
10101011
(&) 00010100
00000000
當然也可以不用00010100這個數而用其他數(如01000100)也可以,只要符合上述條件即可。任何一個數與「0」按位於之後的結果為0。
娶一個數中某些指定位
【例如】
有一個兩位元組的短整型數x,想要取其中的低位元組,只要將x與八進制數(377)8按位於即可。如圖12-1所示,經過運算「z=x&y」後z只保留x的低位元組,高位元組為0.

x 00 10 11 00 10 10 11 00
y 00 00 00 00 11 11 11 11
z 00 00 00 00 10 10 11 00
圖12-1 取x的低八位數

x 00 10 11 00 10 10 11 00
y 11 11 11 11 00 00 00 00
Z 00 10 11 00 00 00 00 00
圖12-2 取x的高8位

如果想取兩個位元組中的高位元組,如圖12-2所示只需進行運算z = x &(177400)8。
保留一個數的某些位
要想將哪一位保留下來,就與一個數進行&運算,此數在該位取1。
【例如】
有一數01110100,想把其中左面第1、3、5位保留下來,可以這樣運算:
01110100 (十進制數116)
(&) 10101010 (十進制數170)
00100000 (十進制數32)

D. C語言 位運算

1. int x=ffo(); int y=bbc(); unsigned int ux=x;unsighed int uy=y; 是ffo();函數的返回值賦給整型的x當然這這里的ffo();函數的返回值也是整型的,後面的賦值跟這一樣理解。
2.在C語言當中,數值的相互轉化吧。例如int bin1=97,printf("%c",bin1),輸出的結構就是字元A,因為A的所對應的ASCII碼值是97 小寫的a的ASCII碼值是65.
3.不理解5bit(w=5),C語言中分有符號和無符號的數,進行計算的時候情況是不一樣的。

E. c語言位運算

^為異或操作,&與操作,|或操作
你沒計算器?
可以用windows自帶的計算器,開始菜單-->運行-->輸入cals,再回車,就可以打開了

F. c語言位運算是什麼

運算:C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。

在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。

當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則就會顯得十分重要。

運算符號:

比較特別的是,比特右移(>>)運算符可以是算術(左端補最高有效位)或是邏輯(左端補0)位移。

例如,將11100011右移3比特,算術右移後成為11111100,邏輯右移則為00011100。因算術比特右移較適於處理帶負號整數,所以幾乎所有的編譯器都是算術比特右移。

運算符的優先順序從高到低大致是:單目運算符、算術運算符、關系運算符、邏輯運算符、條件運算符、賦值運算符(=)和逗號運算符。

G. c語言的按位運算符怎麼操作!

位運算
在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能,
這使得C語言也能像匯編語言一樣用來編寫系統程序。
一、位運算符C語言提供了六種位運算符:
&
按位與
|
按位或
^
按位異或
~
取反
<<
左移
>>
右移
1.
按位與運算
按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1
,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下:
00001001
(9的二進制補碼)&00000101
(5的二進制補碼)
00000001
(1的二進制補碼)可見9&5=1。
按位與運算通常用來對某些位清0或保留某些位。例如把a
的高八位清
0

保留低八位,
可作
a&255
運算
(
255
的二進制數為0000000011111111)。
main(){
int
a=9,b=5,c;
c=a&b;
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。例如:
a<<4
指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6.
右移運算右移運算符「>>」是雙目運算符。其功能是把「>>
」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設
a=15,a>>2
表示把000001111右移為00000011(十進制3)。應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時,
最高位補0,而為負數時,符號位為1,最高位是補0或是補1
取決於編譯系統的規定。Turbo
C和很多系統規定為補1。
main(){
unsigned
a,b;
printf("input
a
number:
");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
請再看一例!
main(){
char
a='a',b='b';
int
p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}

H. C語言中位移位運算符

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與0位異或等於0,1與1位異或等於0,1和0異或等於1
~取反運算符,二進制中運算:~1=0,~0=1,非1等於0(非真得假)非0等於1(非假得真)。

<<左移運算符:運算規則:把"<<"左邊的運算數的各二進制位全部左移若干位,移動的位數由"<<"右邊的數指定,高位丟棄,地位補0。可以實現乘法運算,二進制0000011<<2得二進制00001100.
>>右移運算符:運算規則:把">>"左邊的運算數的各二進制位全部右移若干位,移動的位數由">>"右邊的數指定。有符號的數右移時符號也隨著右移;是正數的話在最高位補0,是負數的話,符號位為1,最高位補0還是補1決取於計算機系統的規定。移入0的稱為"邏輯右移",移入1的稱為「算術左移」。很多系統規定為補1,即「算術右移」。右移運算可以實現除法的功能,右移1位相當於該數除以2,右移n位相當於該數除以2的n次方。
-------------------------------------------------------------------------
運算符 優先順序 運算符類型
& 8 雙目
| 10 雙目
^ 9 雙目
~ 2 單目
<< 5 雙目
>> 5 雙目
---------------------------------------------------------------------------

I. C語言位運算,要過程

應該是先對a取反吧 a=17換為二進制因該是0000 0000 ... 0000 0001 0001一共是32位
對其取反為1111 1111 ... 1111 1110 1110 再對其左移2位得到
1111 1111 ... 1111 1011 1000這就是-72.
至於為什麼是-72你可以參考
那麼~就是對每位取反也就是11111111 11111111 11111111 11101111這就是取反後的二進製表示形式,他的值就是-17,這里你可能不明白這么一大串1怎麼會是-17,在電腦內存中,數值型據是以補碼的形式存在的,正數的補碼不變。負數的補碼是反碼再+1
11111111 11111111 11111111 11101111這就是-17在內存中的表示,怎麼由它得到-17呢,先在最低位-1,在除符號位(最前面)取反,
也就是10000000 00000000 00000000 00010001這樣你該明白了吧,最前面那個1就代表符號,10001就是17

http://..com/question/1174425839489157019.html

J. C語言編寫程序,進行位運算。

位運算

在很多系統程序中常要求在位(bit)一級進行運算或處理。C語言提供了位運算的功能, 這使得C語言也能像匯編語言一樣用來編寫系統程序。

一、位運算符C語言提供了六種位運算符:

& 按位與
| 按位或
^ 按位異或
~ 取反
<< 左移
>> 右移

1. 按位與運算 按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。

例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。

按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為0000000011111111)。
main(){
int a=9,b=5,c;
c=a&b;
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。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。6. 右移運算 右移運算符「>>」是雙目運算符。其功能是把「>> 」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把000001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。
main(){
unsigned a,b;
printf("input a number: ");
scanf("%d",&a);
b=a>>5;
b=b&15;
printf("a=%d\tb=%d\n",a,b);
}
請再看一例!
main(){
char a='a',b='b';
int p,c,d;
p=a;
p=(p<<8)|b;
d=p&0xff;
c=(p&0xff00)>>8;
printf("a=%d\nb=%d\nc=%d\nd=%d\n",a,b,c,d);
}

位域

有些信息在存儲時,並不需要佔用一個完整的位元組, 而只需占幾個或一個二進制位。例如在存放一個開關量時,只有0和1 兩種狀態, 用一位二進位即可。為了節省存儲空間,並使處理簡便,C語言又提供了一種數據結構,稱為「位域」或「位段」。所謂「位域」是把一個位元組中的二進位劃分為幾個不同的區域, 並說明每個區域的位數。每個域有一個域名,允許在程序中按域名進行操作。 這樣就可以把幾個不同的對象用一個位元組的二進制位域來表示。一、位域的定義和位域變數的說明位域定義與結構定義相仿,其形式為:
struct 位域結構名
{ 位域列表 };
其中位域列表的形式為: 類型說明符 位域名:位域長度

例如:
struct bs
{
int a:8;
int b:2;
int c:6;
};
位域變數的說明與結構變數說明的方式相同。 可採用先定義後說明,同時定義說明或者直接說明這三種方式。例如:
struct bs
{
int a:8;
int b:2;
int c:6;
}data;
說明data為bs變數,共占兩個位元組。其中位域a佔8位,位域b佔2位,位域c佔6位。對於位域的定義尚有以下幾點說明:

1. 一個位域必須存儲在同一個位元組中,不能跨兩個位元組。如一個位元組所剩空間不夠存放另一位域時,應從下一單元起存放該位域。也可以有意使某位域從下一單元開始。例如:
struct bs
{
unsigned a:4
unsigned :0 /*空域*/
unsigned b:4 /*從下一單元開始存放*/
unsigned c:4
}
在這個位域定義中,a占第一位元組的4位,後4位填0表示不使用,b從第二位元組開始,佔用4位,c佔用4位。

2. 由於位域不允許跨兩個位元組,因此位域的長度不能大於一個位元組的長度,也就是說不能超過8位二進位。

3. 位域可以無位域名,這時它只用來作填充或調整位置。無名的位域是不能使用的。例如:
struct k
{
int a:1
int :2 /*該2位不能使用*/
int b:3
int c:2
};
從以上分析可以看出,位域在本質上就是一種結構類型, 不過其成員是按二進位分配的。

二、位域的使用位域的使用和結構成員的使用相同,其一般形式為: 位域變數名·位域名 位域允許用各種格式輸出。
main(){
struct bs
{
unsigned a:1;
unsigned b:3;
unsigned c:4;
} bit,*pbit;
bit.a=1;
bit.b=7;
bit.c=15;
printf("%d,%d,%d\n",bit.a,bit.b,bit.c);
pbit=&bit;
pbit->a=0;
pbit->b&=3;
pbit->c|=1;
printf("%d,%d,%d\n",pbit->a,pbit->b,pbit->c);
}

上常式序中定義了位域結構bs,三個位域為a,b,c。說明了bs類型的變數bit和指向bs類型的指針變數pbit。這表示位域也是可以使用指針的。
程序的9、10、11三行分別給三個位域賦值。( 應注意賦值不能超過該位域的允許范圍)程序第12行以整型量格式輸出三個域的內容。第13行把位域變數bit的地址送給指針變數pbit。第14行用指針方式給位域a重新賦值,賦為0。第15行使用了復合的位運算符"&=", 該行相當於: pbit->b=pbit->b&3位域b中原有值為7,與3作按位與運算的結果為3(111&011=011,十進制值為3)。同樣,程序第16行中使用了復合位運算"|=", 相當於: pbit->c=pbit->c|1其結果為15。程序第17行用指針方式輸出了這三個域的值。

類型定義符typedef

C語言不僅提供了豐富的數據類型,而且還允許由用戶自己定義類型說明符,也就是說允許由用戶為數據類型取「別名」。 類型定義符typedef即可用來完成此功能。例如,有整型量a,b,其說明如下: int aa,b; 其中int是整型變數的類型說明符。int的完整寫法為integer,

為了增加程序的可讀性,可把整型說明符用typedef定義為: typedef int INTEGER 這以後就可用INTEGER來代替int作整型變數的類型說明了。 例如: INTEGER a,b;它等效於: int a,b; 用typedef定義數組、指針、結構等類型將帶來很大的方便,不僅使程序書寫簡單而且使意義更為明確,因而增強了可讀性。例如:
typedef char NAME[20]; 表示NAME是字元數組類型,數組長度為20。
然後可用NAME 說明變數,如: NAME a1,a2,s1,s2;完全等效於: char a1[20],a2[20],s1[20],s2[20]
又如:
typedef struct stu{ char name[20];
int age;
char sex;
} STU;
定義STU表示stu的結構類型,然後可用STU來說明結構變數: STU body1,body2;
typedef定義的一般形式為: typedef 原類型名 新類型名 其中原類型名中含有定義部分,新類型名一般用大寫表示, 以
便於區別。在有時也可用宏定義來代替typedef的功能,但是宏定義是由預處理完成的,而typedef則是在編譯時完成的,後者更為靈活方便。