平特心水报图
新網絡營銷基礎與實踐

你的位置:首頁 >網絡營銷 >c語言移位

c語言移位

C語言里的左移和右移運算:

      比較淺顯的來說,左移n位就是乘以2的n次方,右移n位就是除以2的n次方。

      先說左移,左移就是把一個數的所有位都向左移動若干位,在C中用<<運算符。例如:nt 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這個值是-2147483648,溢出。如果再接著把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補最低位。

      再說右移,明白了左移的道理,那么右移就比較好理解了。右移的概念和左移相反,就是往右邊挪動若干位,運算符是>>。右移對符號位的處理和左移不同,對于有符號整數來說,比如int類型,右移會保持符號位不變,例如:int i = 0x80000000;i = i >> 1;i的值不會變成0x40000000,而會變成0xc0000000,就是說,符號位向右移動后,,正數的話補0,負數補1,也就是匯編語言中的算術右移。同樣當移動的位數超過類型的長度時,會取余數,然后移動余數個位。負數10100110 >>5(假設字長為8位),則得到的是11111101。

      總之,在C中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變。實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比循環效率高很多。

C語言的移位操作符:

      移位運算符是將數據看成二進制數,對其進行向左或向右移動若干位的運算。移位運算符分為左移和右移兩種,均為雙目運算符。第一運算對象是移位對象,第二個運算對象是所移的二進制位數。

      移位時,移出的位數全部丟棄,移出的空位補入的數與左移還是右移花接木有關。如果是左移,則規定補入的數全部是0;如果是右移,還與被移位的數據是否帶符號有關。若是不帶符號數,則補入的數全部為0;若是帶符號數,則補入的數全部等于原數的最左端位上的原數(即原符號位)。

      移位運算符的優先級如下:算術運算符優先于移位運算符優先于關系運算符,移位運算符是同級別的,結合性是自左向右。例如,設無符號短整型變量a為0111(對應二進制數為0000000001001001),則:a<<3 結果為01110(對應二進制數為0000001001001000),a不變,a>>4 結果為04 (對應二進制數為0000000000000100),a不變。又如,設短整型變量a為-4(對應二進制數為 1111111111111100),則:a<<3 結果為-32(對應二進制數為1111111111100000),a不變,a>>4 結果為-1(對應二進制數為1111111111111111),a不變。

C語言中的移位操作:

      移位運算的兩個運算數必須是整形表達式,在運算數的兩邊完成整形提升,表達式整體的類型與提升后的左運算數相同;左移位 exp1<<exp2的表達式使得exp1的位被按expr2指明的數目進行左移,并在低端移入0;右移位運算符>>與左移位運算符是不對稱的。對左操作數進行移位取決于左操作數的類型:(1)如果左操作數是無符號(或帶符號的非負數),則左邊移入0;(2)如果左操作數是帶符號的負數,則實現者可以選擇補0或者把左操作數最左邊的位移入(常見的是填充符號位)。左移時總是移位和補零。右移時無符號數是移位和補零,此時稱為邏輯右移;而有符號數大多數情況下是移位和補最左邊的位(也就是補最高有效位),移幾位就補幾位,此時稱為算術右移。

網絡營銷詞典內容均由網友提供,僅供參考。

平特心水报图 pk10精准人工计划软件手机版下载 彩票软件公司 黑龙江11选5开奖视频 幸运飞艇六码倍投图 广东11选5任一推荐计划 幸运飞艇的最稳打法 36棋牌怎么注册 拍风景片的人靠什么赚钱 重庆时时预测计划 贪玩蓝月平民职业选择