⑴ c語言什麼是位運算
C語言是為描述系統而設計的,它的第一個應用就是UNIX操作系統的設計,因此必須具有低級語言的特點。指針運算和位運算就是其代表。計算機中的信息以及控制信號均是以二進制碼的0、1的形式存儲和處理的。每一個0或1稱為一個「位」(bit),8位構成一個位元組(byte)。在內存中,每一個位元組均有一個編號,稱為內存地址。 在以前的各章節中,都是將一個位元組(如字元型)和若干位元組(如整型、實型等)中的內容作為一個整體進行處理的(賦值、運算、I/O操作)。 位運算則是針對這些位元組中的若干位進行操作。這在系統軟體設計中和自動控制中是十分有用的。
⑵ 位運算符的C語言的六種位運算符
&按位與|按位或^按位異或~取反<<左移>>右移 按位與運算符&是雙目運算符。 其功能是參與運算的兩數各對應的二進位相與。只有對應的兩個二進位均為1時,結果位才為1 ,否則為0。參與運算的數以補碼方式出現。
例如:9&5可寫算式如下: 00001001 (9的二進制補碼)&00000101 (5的二進制補碼) 00000001 (1的二進制補碼)可見9&5=1。 按位與運算通常用來對某些位清0或保留某些位。例如把a 的高八位清 0 , 保留低八位, 可作 a&255 運算 ( 255 的二進制數為11111111)。 main(){inta=9,b=5,c;c=a&b;printf(a=%d
b=%d
c=%d
,a,b,c);} 按位或運算符「|」是雙目運算符。 其功能是參與運算的兩數各對應的二進位相或。只要對應的二個二進位有一個為1時,結果位就為1。參與運算的兩個數均以補碼出現。
例如: 9|5可寫算式如下: 00001001|00000101=00001101(十進制為13)可見9|5=13 main(){inta=9,b=5,c;c=a|b;printf(a=%d
b=%d
c=%d
,a,b,c);} 按位異或運算符「^」是雙目運算符。 其功能是參與運算的兩數各對應的二進位相異或,當兩對應的二進位相異時,結果為1。
參與運算數仍以補碼出現。
例如 9^5可寫成算式如下: 00001001^00000101=00001100(十進制為12) main(){inta=9;a=a^15;printf(a=%d
,a);} 求反運算符~為單目運算符,具有右結合性。 其功能是對參與運算的數的各二進位按位求反。
例如 ~9的求反運算為: ~(1001)結果為: 0110 左移運算符「<<」是雙目運算符。左移n位就是乘以2的n次方。 其功能把「<<」左邊的運算數的各二進位全部左移若干位,由「<<」右邊的數指定移動的位數,高位丟棄,低位補0。
1)例: a<<4 指把a的各二進位向左移動4位。如a=00000011(十進制3),左移4位後為00110000(十進制48)。
2)例: int i = 1; i = i << 2; //把i里的值左移2位 也就是說,1的2進制是000...0001(這里1前面0的個數和int的位數有關,32位機器,gcc里有31個0),左移2位之後變成 000...0100,也就是10進制的4,所以說左移1位相當於乘以2,那麼左移n位就是乘以2的n次方了(有符號數不完全適用,因為左移有可能導致符號變化,下面解釋原因)
需要注意的一個問題是:int類型最左端的符號位和移位移出去的情況. 我們知道,int是有符號的整形數,最左端的1位是符號位,即0正1負,那麼移位的時候就會出現溢出, 例如: int i = 0x40000000; //16進制的40000000,為2進制的01000000...0000 i = i << 1; 那麼,i在左移1位之後就會變成0x80000000,也就是2進制的100000...0000,符號位被置1,其他位全是0,變成了int類型所能表示的最小值,32位的int這個值是,溢出.如果再接著把i左移1位會出現什麼情況呢?
在C語言中採用了丟棄最高位的處理方法,丟棄了1之後,i的值變成了0. 左移里一個比較特殊的情況是當左移的位數超過該數值類型的最大位數時,編譯器會用左移的位數去模類型的最大位數,然後按余數進行移位,如: int i = 1, j = 0x80000000; //設int為32位 i = i << 33; // 33 % 32 = 1 左移1位,i變成2 j = j << 33; // 33 % 32 = 1 左移1位,j變成0,最高位被丟棄 在用gcc編譯這段程序的時候編譯器會給出一個warning,說左移位數>=類型長度.那麼實際上i,j移動的就是1位,也就是33%32後的余數.在gcc下是這個規則,不同編譯器可能會不完全相同.
總之左移就是: 丟棄最高位,0補最低位 右移運算符「>>」是雙目運算符。右移n位就是除以2的n次方
其功能是把「>>」左邊的運算數的各二進位全部右移若干位,「>>」右邊的數指定移動的位數。
例如:設 a=15,a>>2 表示把00001111右移為00000011(十進制3)。 應該說明的是,對於有符號數,在右移時,符號位將隨同移動。當為正數時, 最高位補0,而為負數時,符號位為1,最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。
右移對符號位的處理和左移不同: 對於有符號整數來說,比如int類型,右移會保持符號位不變,
例如: int i = 0x80000000; i = i >> 1; //i的值不會變成0x40000000,而會變成0xc0000000 就是說,對於有符號數, 符號位向右移動後,正數的話補0,負數補1, 對於有符號數,在右移時,符號位將隨同移動: 當為正數時, 最高位補0, 而為負數時,符號位為1, 也就是匯編語言中的算術右移.同樣當移動的位數超過類型的長度時,會取余數,然後移動余數個位. 最高位是補0或是補1 取決於編譯系統的規定。Turbo C和很多系統規定為補1。 負數10100110 >>5(假設字長為8位),則得到的是 11111101 總之,在C中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變.實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比循環效
率高很多. x>>1;//相當於x/=2x<<1;//相當於x*=2x>>2;//x/=4x<<2;//x*=4x>>3;//x/=8x<<3;//x*=8以此類推. 無符號: main(){unsigneda,b;printf(inputanumber:);scanf(%d,&a);b=a>>5;b=b&15;printf(a=%d b=%d
,a,b);}請再看一例! main(){chara='a',b='b';intp,c,d;p=a;p=(p<<8)|b;d=p&0xff;c=(p&0xff00)>>8;printf(a=%d
b=%d
c=%d
d=%d
,a,b,c,d);} 1. 使特定位翻轉 要使哪幾位翻轉就將與其進行∧運算的該幾位置為1即可。
2 與0相∧,保留原值.
3.交換兩個值,不用臨時變數. 我們可以在不用引入其他變數就可以實現變數值的交換 用異或操作可以實現: a = a^b; //
(1) b = a^b; //
(2) a = a^b; //
(3) 異或操作滿足結合律和交換律,且由異或操作的性質知道,對於任意一個整數a^a=0; 證:(第(2)步中的a) a = a^b =(將第(1)步中的b代入b) a^(a^b) = b; (第(3)步中的b)b =a^b = (將第(1)步中的b代入b,將第(2)步中的a代入a) a^b^a^a^b = a^a^a^b^b = a; 清零 A數中為1的位,B中相應位為0。然後使二者進行&運算,即可達到對A清零目的。
取一個數中某些指定位 取數A的某些位,把數B的某些位置1,就把數A的某些位與1按位與即可。
保留一位的方法 數A與數B進行&運算,數B在數A要保留的位1,其餘位為零。
判斷奇偶性 將變數 a的奇偶性。a與1做位與運算,若結果是1,則 a是奇數;將 a與1做位與運算,若結果是0,則 a是偶數。 判斷int型變數a是奇數還是偶數 a&1 = 0 偶數 a&1 = 1 奇數
取int型變數a的第k位 (k=0,1,2……sizeof(int)),即a>>k&1
將int型變數a的第k位清0,即a=a&~(1<<k)
將int型變數a的第k位置1, 即a=a|(1<<k)
int型變數循環左移k次,即a=a<<k|a>>16-k (設sizeof(int)=16)
int型變數a循環右移k次,即a=a>>k|a<<16-k (設sizeof(int)=16)
整數的平均值
對於兩個整數x,y,如果用 (x+y)/2 求平均值,會產生溢出,因為 x+y 可能會大於INT_MAX,但是我們知道它們的平均值是肯定不會緋齙模?頤怯萌縵濾惴ǎ?/DIV> int average(int x, int y) //返回X,Y 的平均值 { return (x&y)+((x^y)>>1); }
判斷一個整數是不是2的冪,對於一個數 x >= 0,判斷他是不是2的冪 boolean power2(int x) { return ((x&(x-1))==0)&&(x!=0); }
不用temp交換兩個整數 void swap(int x , int y) { x ^= y; y ^= x; x ^= y; } php: $a ='dd'; $b = 'bb'; $a = $a ^ $b; $b = $a ^ $b;
$a = $a ^ $b; echo $a,' ', $b; 10 計算絕對值 int abs( int x ) { int y ; y = x >> 31 ; return (x^y)-y ; //or: (x+y)^y }
取模運算轉化成位運算 (在不產生溢出的情況下) a % (2^n) 等價於 a & (2^n - 1) 12 乘法運算轉化成位運算 (在不產生溢出的情況下) a * (2^n) 等價於 a<< n 13. 除法運算轉化成位運算 (在不產生溢出的情況下) a / (2^n) 等價於 a>> n 例: 12/8 == 12>>3 14 . a % 2 等價於 a & 1 15 if (x == a) x= b; else x= a; 等價於 x= a ^ b ^ x;
16 x 的 相反數 表示為 (~x+1)abc
⑶ .C語言中:除法運算符「/」雙目運算具有左結合性--"雙目運算"是什麼意思
即字元的左右兩邊要同時有數據,例如加法運算符"+"就是雙目運算符,要求兩邊都有數字.C語言還具有單目運算符"!",或者三目運算符
?
:
⑷ C語言的位運算在實際操作中有什麼用
位運算加速技巧
1. 如果乘上一個2的倍數數值,可以改用左移運算(Left Shift) 加速 300%x = x * 2;
x = x * 64;
//改為:
x = x << 1; // 2 = 21
x = x << 6; // 64 = 262. 如果除上一個 2 的倍數數值,可以改用右移運算加速 350%x = x / 2;
x = x / 64;
//改為:x = x >> 1;// 2 = 21
x = x >> 6;// 64 = 263. 數值轉整數加速 10%x = int(1.232)
//改為:x = 1.232 >> 0;4. 交換兩個數值(swap),使用 XOR 可以加速20%var t:int = a;
a = b;
b = t;
//equals:
a = a^b;
b = a^b;
a = a^b;5. 正負號轉換,可以加入 300%i = -i;
//改為
i = ~i + 1; // NOT 寫法
//或
i = (i ^ -1) + 1; // XOR 寫法
6. 取余數,如果除數為 2 的倍數,可利用 AND 運算加速 600%x = 131 % 4;
//equals:
x = 131 & (4 - 1);7. 利用 AND 運算檢查整數是否為 2 的倍數,可以加速 600%isEven = (i % 2) == 0;
//equals:
isEven = (i & 1) == 0;8. 加速 Math.abs 600% 的寫法1,寫法2 又比寫法1加速 20%//寫法1
i = x < 0 ? -x : x;//寫法2i = (x ^ (x >> 31)) - (x >> 31);//寫法3i=x^(~(x>>31)+1)+(x>>31);9. 比較兩數值相乘之後是否擁有相同的符號,加速 35%eqSign = a * b > 0;
//equals:
eqSign = a ^ b > 0;其它位運算技巧
1. RGB 色彩分離var 24bitColor:uint = 0xff00cc;
var r:uint = 24bitColor >> 16;
var g:uint = 24bitColor >> 8 & 0xFF;
var b:uint = 24bitColor & 0xFF;2. RGB 色彩合並var r:uint = 0xff;
var g:uint = 0x00;
var b:uint = 0xcc;
var 24bitColor:uint = r << 16 | g << 8 | b;
⑸ c語言位運算是什麼
運算:C語言的運算非常靈活,功能十分豐富,運算種類遠多於其它程序設計語言。
在表達式方面較其它程序語言更為簡潔,如自加、自減、逗號運算和三目運算使表達式更為簡單,但初學者往往會覺的這種表達式難讀,關鍵原因就是對運算符和運算順序理解不透不全。
當多種不同運算組成一個運算表達式,即一個運算式中出現多種運算符時,運算的優先順序和結合規則就會顯得十分重要。
運算符號:
比較特別的是,比特右移(>>)運算符可以是算術(左端補最高有效位)或是邏輯(左端補0)位移。
例如,將11100011右移3比特,算術右移後成為11111100,邏輯右移則為00011100。因算術比特右移較適於處理帶負號整數,所以幾乎所有的編譯器都是算術比特右移。
運算符的優先順序從高到低大致是:單目運算符、算術運算符、關系運算符、邏輯運算符、條件運算符、賦值運算符(=)和逗號運算符。
⑹ C語言中除法運算符「/」與數學中的運算符「÷」的用法和功能完全一樣嗎
基本相同 但是浮點運算float a時候用/才有浮點
⑺ C語言 運算符%是怎麼運算的
C語言中%的作用:%作為運算符是用來取余的
運算符(operator)是可以對數據進行相應操作的符號。如對數據求和操作,用加法運算符 '+',求積操作使用乘法運算符 '*' ,求余數用運算符'%'。等等
例如 :
一、25%4=1 ;25除以4商6餘數是1
二、33%5=3 ;33除以5商6餘數是3
(7)c語言位運算除法擴展閱讀:
C語言常用的運算符
1. 算術運算符
用於各類數值運算。包括加(+)、減(-)、乘(*)、除(/)、求余(或稱模運算,%)、自增(++)、自減(--)共七種。
2.關系運算符
用於比較運算。包括大於(>)、小於(<)、等於(==)、 大於等於(>=)、小於等於(<=)和不等於(!=)六種。
3.邏輯運算符
用於邏輯運算。包括與(&&)、或(||)、非(!)三種。
4.位操作運算符
參與運算的量,按二進制位進行運算。包括位與(&)、位或(|)、位非(~)、位異或(^)、左移(<<)、右移(>>)六種。
5.賦值運算符
用於賦值運算,分為簡單賦值(=)、復合算術賦值(+=,-=,*=,/=,%=)和復合位運算賦值(&=,|=,^=,>>=,<<=)三類共十一種。
6.條件運算符
這是一個三目運算符,用於條件求值(?:)。
7.逗號運算符
用於把若干表達式組合成一個表達式(,)。
8.指針運算符
用於取內容(*)和取地址(&)二種運算。
9.求位元組數運算符
用於計算數據類型所佔的位元組數(sizeof)。
10.特殊運算符
有括弧(),下標[],成員(→,.)等幾種。
⑻ 關於C語言中的位運算。
位運算能使c具有匯編的某些能力
比如提高運算速度啊 和硬體更好的偷情啊 節約存儲空間什麼的 等等
比如說吧
像樓上的直接移位就比使用/運算符快些哈
⑼ C語言 位運算
~取反,0取反是1,1取反是0
<<是左移,比如1<<n,表示1往左移n位,即數值大小2的n次方
>>右移,類似左移,數值大小除以2的n次方
&按位與,1與任意數等於任意數本身,0與任意數等於0,即1&x=x,0&x=0
|按位或,x|y中只要有一個1則結果為1
^按位異或,x^y相等則為0,不等則為1
所有數值必須轉換為二進制數才能位運算,每一位數相對應運算
⑽ c語言除法運算
用%這個算符,意思是取余數
比如:
a=2;
b=3;
那麼b%a的結果就是3除以2的余數,結果是1;
參考程序段:
main()
{
int i,n;
printf("input your number: ");
scanf("%d",&n);
for(i=1;i<n;i++)
{
if(n%i) continue;
printf("%d ",i);
}
}
(10)c語言位運算除法擴展閱讀:
余數有如下一些重要性質(a,b,c 均為自然數):
(1)余數和除數的差的絕對值要小於除數的絕對值(適用於實數域);
(2)被除數 = 除數 × 商 + 余數;
除數=(被除數 - 余數)÷ 商;
商=(被除數 - 余數)÷除數;
余數=被除數 - 除數 × 商。