c語言什麼是位運算
1. c語言的按位與、或、非、異或都什麼意思。有什麼用
這些是位操作運算符:參與運算的量,按二進制位進行運算。
在計算機中,數據都是以二進制數形式存放的,位運算就是指對存儲單元中二進制位的運算。C語言提供6種位運算符。
包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
位運算符 & |~<< >> ∧ 按優先順序從高到低排列的順序是:
位運算符中求反運算「~「優先順序最高,而左移和右移相同,居於第二,接下來的順序是按位與 「&「、按位異或 「∧「和按位或 「|「。順序為~ << >> & ∧ | 。
(1)c語言什麼是位運算擴展閱讀:
例:設二進制數a是00101101 ,若通過異或運算a∧b 使a的高4位取反,低4位不變,則二進制數b是。
解析:異或運算常用來使特定位翻轉,只要使需翻轉的位與1進行異或操作就可以了,因為原數中值為1的位與1進行異或運算得0 ,原數中值為0的位與1進行異或運算結果得1。而與0進行異或的位將保持原值。異或運算還可用來交換兩個值,不用臨時變數。
如 int a=3 , b=4;,想將a與b的值互換,可用如下語句實現:
a=a∧b;
b=b∧a;
a=a∧b;
所以本題的答案為: 11110000 。
2. C語言位運算
按位與 | 按位或 ^
按位異或 ~ 取反 <<
左移 >> 右移<<
1. 按位與運算。按位與運算符"&"是雙目運算符。其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
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); }。
5. 左移運算。左移運算符「<<」是雙目運算符。其功能把「<< 」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數, 高位丟棄,低位補0。例如: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
3. C語言位運算
C語言提供的位運算: 運算符 含義
& 按位與
| 按位或
∧ 按位異或
∽ 取反
<< 左移
>> 右移 說明:橘激1。位運算符中除∽以外,均為二目(元)運算符,即要求兩側各有一個運算了量。2、運算量只能鍵含是整形或字元型的數據,不能為實型數據。 「按位與」運算符(&) 規定如下:0&0=0 0&1=0 1&0=0 1&1=1 例:3&5=?
先把3和5以補碼表示,再進行按位與運算。3的補碼: 00000011
5的補碼: 00000101 --------------------------------------------------------------------------------
&: 00000001 3&5=1 「按位或」運算符(|) 規定如下:0|0=0 0&1=1 1&0=1 1&1=1 例:060|017=?
將八進制數60與八進制數17進行按位或運算。 060 00110000
017 00001111 --------------------------------------------------------------------------------
|: 00111111 060|017=077 「異或」運算符(∧),也稱XOR運算符 規定如下:0∧0=0 0∧1=1 1∧0=1 1∧1=0 例:57∧42=?
將十進制數57與十進制數42進行按位異或運算。 57 00111001
42 00101010 --------------------------------------------------------------------------------
∧: 00010011 57∧42=19 「取反」運算符(∽) 規定如下:∽0=1 ∽1=0 例:∽025=?
對八進制數25(即二進制0000000000010101)按位求反。0000000000010101
↓
1111111111101010 ∽025=177752 左移運算符(<<) 將一個數的二進位全部左移若干位,若高位左移後溢出,則舍棄,不起作用。 例:a=a<<2
將a的二進制數左移2位,右補0。
若a=15,即二進制數00001111,則a 00001111
↓ ↓
a<<1 00011110
↓ ↓
a<<2 00111100 最後a=60 右移運算符(>>) 將一個數的二進位全部右移若干位,低位移出部分舍棄。 例:a=a>>2
將a的二進制數右移2位,左補0。
若a=15,即二進制數00001111,則a 00001111
↓ ↓
a>>1 00000111
↓ ↓
a>>2 00000011 最後a=3位運算符與賦值運算符結合可以組成擴展的賦值運算符 如稿伍笑:&=,|=,>>=,<<=,∧= 例:a&=b相當於a=a&b a<<=2相當於a=a<<2不同長度的數據進行位運算 如果兩個數據長度不同(例如long型和int型)進行位運算時(如a&b,而a為long型,b為int型),系統會將二者按右端對齊。如果b為正數,則左側16位補滿0。若b為負,左端應補滿1。如果b為無符號整數型,則左端添滿0。位運算舉例
例:取一個整數a從右端開始的4∽7位 考慮如下:1、先是a右移4位,即a>>4 2、設置一個低4位全為0的數,即∽(∽0<<4) 3、將上面兩式進行與運算,即a>>4&∽(∽0<<4) 程序如下: main() {unsigned a,b,c,d;</p><p> scanf("%o",&a);</p><p> b=a>>4;</p><p> c=∽(∽0<<4);</p><p> d=b&c;</p><p> printf("%o\n%o\n",a,b);</p><p> } 結果:331↙ 331(a的值,八進制) 15 (d的值,八進制)例:循環移位。要求將a進行右循環移位。即a右循環移n位,將a中原來左面(16-n)位右移n位。現假設兩個位元組存放一個整數。如右圖。 考慮如下:1、先將a右端n位放到b中的高n位中,即:b=a<<(16-n) 2、將a右移n位,其左面高位n位補0,即c=a>>n 3、將c與b進行按位或運算,即c=c|b 程序如下: main() {unsigned a,b,c;int n:</p><p> scanf("a=%o,n=%d",&a,&n);</p><p> b=a<<(16-n);</p><p> c=a>>n;</p><p> c=c|b;</p><p> printf("%o\n%o",a,c);</p><p> } 結果:a=157653,n=3↙ 331(a的值,八進制) 15 (d的值,八進制)位段
所謂位段是以位為單位定義長度的結構體類型中的成員。 例:struct packed-data {unsigned a:2;</p><p> unsigned b:6;</p><p> unsigned c:4;</p><p> unsigned d:4;</p><p> int i;</p><p> }data;