C語言中,與2乘左移,與2除右移,這個是啥意思,求詳細解釋

時間 2021-09-07 11:57:35

1樓:布策幸向榮

這句話的意思就是:

對乙個數實施左移操作=對這個數×2;

對乙個數實施右移操作=對這個數÷2。

這個是計算機基本的二進位制操作,因此不僅僅侷限於c語言,事實上絕大多數計算機程式語言都支援這個操作。

理解很容易:

乙個(十進位制的)數,在電腦裡面都可以按二進位制表示。

比如數字8,

二進位制就是1000.

左移一位,1000

<<1=

0001

0000

=16,

因此就是=8×2;同理右移一位,

1000

>>1=

0100=4,

就是8÷2.

乙個十進位制a(這裡先以正整數為例說明),

總可以表示成:a=

a[n-1]*2^(n-1)+a[n-2]*2(n-2)+....

a[1]*2^1

+a[0]+2^0;

這裡a[n-1]....a[0]的取值範圍就是0或1,就是乙個二進位制數各個位上權係數。

假設a[i]

<

->a[i+k];

它對整個數的貢獻值,從2^i

->2^(i+k)

=2^i

×2^k,

二進位制的每一位都這樣操作,因此這個數就被放大了2^k倍。當k=1的時候,就是×2;同理右移就是÷2^k.

c語言中為什麼左移不分符號數無符號數,而右移分呢??

2樓:手機使用者

因為在c語言標準中,只規定了無符號數的移位操作是採用邏輯移位(即左移、右移都是使用的邏輯左移和邏輯右移)。

而對於有符號數,其左移操作還是邏輯左移,但右移操作是採用邏輯右移還是算術右移就取決於機器了!(算術右移和邏輯右移的區別是:算術右移不右移符號位,即最高位,右移後前補0還是1取決於符號位的值;邏輯右移執行時將移動符號位,右移後前補0)

因此,乙個程式如果使用了有符號數的右移位操作,它就是不可移植的了。

3樓:

左移時是不區分無符號數的,而進行右移時也不區分是否是無符號,移進的值在最高位補0。

例如:0xff進行右移一位0xff>>1,其結果為0x7f,請參見以下**:

#include

int main()

執行結果為:a = 7f

4樓:10伯樂

計算機中存放的是二進位制補碼表示的,正數的補碼是本身,而負數的補碼是取反加1.

所以負數的補碼在求其真值是也是對其作取補運算。

左移、右移其實就是乘或除2,這個不影響符號,所以負數的右移補符號位,保證是負數。

這只是大道理,您自己推一下就很容易理解了。

5樓:匿名使用者

因為左移定義是,每個移出的位進入進製標誌,右邊填充0,無論是有符號數還是無符號數都這麼操作,這是規定。那麼,這樣的操作對有符號數和無符號數的結果都是一樣的,所以左移不分有符號數還是無符號數。

c語言中,移位表示什麼?有什麼用?

6樓:匿名使用者

比較淺顯的來說,左移n位就是乘以2的n次方,右移n位就是除以2的n次方。具體細節如下:

c語言裡的左移和右移運算

2006-09-30 13:52

先說左移,左移就是把乙個數的所有位都向左移動若干位,在c中用《運算子.例如:

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這個值是-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中,左移是邏輯/算術左移(兩者完全相同),右移是算術右移,會保持符號位不變.實際應用中可以根據情況用左/右移做快速的乘/除運算,這樣會比迴圈效率高很多.

7樓:

int x = 200;

x>>1; //相當於 x /= 2

x<<1; //相當於 x *= 2

x>>2; // x /= 4

x<<2; // x *= 4

x>>3; // x /= 8

x<<3; // x *= 8

以此類推

8樓:匿名使用者

跟任何其他計算機語言的移位概念一樣。

c語言中「>>=,<<=,&=,^=,|=」分別表示什麼意思?請舉例說明

9樓:弋風

1、c語言中的 >>= 意思為:右移後

賦值**示例為:

x = 8; x >>= 3;

右移後結果為:00000000 00000000 00000000 00000001

2、c語言中的 <<= 意思為:左移後賦值**示例為:

x = 8;

x <<= 3;

左移後賦值結果為:00000000 00000000 00000000 01000000

3、c語言中的 &= 意思為:按位與後賦值**示例為:

x = 0x02;

x &= 0x01;

按位與後的結果為:0x00

4、c語言中的 ^= 意思為:按位異或後賦值**示例為:

x = 0x02;

x ^= 0x01;

按位異或的結果為:0x03 等同於00115、c語言中的 |= 意思為:按位或後賦值**示例為:

x = 0x02;

x  |= 0x01;

按位或的結果為:0x03 等同於0011

10樓:匿名使用者

復合賦值。a>>=b相當於 a = a >> b; 以此類推。

a>>=b 表示把二進位制a右移b位,比如:

a = 8;

a >>= 3;

即:二進位制8: 00000000 00000000 00000000 00001000

右移3位: 00000000 00000000 00000000 00000001

結果是1,再把右移結果賦值給a, 即最後a=1。

<<= 同上,只不過是左移賦值。

&= 是按位與之後賦值,^=是按位異或之後賦值,|=是按位或之後賦值。與,或以及異或的操作很簡單:

101010         101010        101010

& 011100       | 011100      ^ 011100

---------     ----------    ----------

001000         111110        110110

11樓:匿名使用者

a = 0010(0x02)

a >>= 1; (a 右移1位並把右移的結果重新賦值給a) 此時a = 0001(0x01);

a <<= 1;(a左移1位並把左移的結果重新賦值給a) 此時 a = 0100(0x04);

a &= 0x01;( a與0x01 按位與,並把按位與的結果重新賦值給a)。此時a = 0x0;

a |= 0x01;( a與0x01 按位或,並把按位或的結果重新賦值給a)。此時a = 0011(0x03);

a ^= 0x01;( a與0x01 按位異或,並把按位異或的結果重新賦值給a)。此時a = 0x03;(異或的意思就是,該位均為相同的則該位結果為0,該位均為不同的則該位結果為1)

c語言中的右移一位是不是應該除以2?

12樓:匿名使用者

不是c語言的有符號整數向右移位運算不等同於除以2的某次冪如(-1)/2和(-1)>>1,前者的結果一般是0,後者一般是-1,所以在c語言中,負數向右移動1位並不等同於除以2。

解決的方法是:當除數是2的n次冪時,x/(2^n),可以用移位操作(x + 2^n - 1) >> n來代替(x + 2^n - 1須小於0,^是乘方操作)

在c語言中,-100/8=-12,而-100>>3=-13,兩者不相等,而用(-100+7)>>3代替則相等。

c語言中的右移一位是不是應該除以2

13樓:非常可愛

右移一來位相當於除以2。

例:5>>1

5的二自進bai制表示是101,那麼右移一位之du後是zhi10就是2了,是整除的;左移的dao話就是在後面補乙個零,相當於是乘以二,那麼變成了1010,十進位制是10。

101右移,就是把最後一位拿掉了,是10這個是二進位制的,十進是2,5/2本來是小數,但這裡是整數操作的,所以把小數部分去掉了。

擴充套件資料

c語言中的左移

1、左移就是把乙個數的所有位都向左移動若干位,在c中用《運算子.例如:

inti=1;

i=i<<2;//把i裡的值左移2位。

2、補符號位,就是乙個signedchara=0xff;

a=a>>1;/*它仍是0xff,補了符號位。最高位是符號位=1,右移後符號位保持不變*/;

a=0x80;

a=a>>1;/*變成了0xc0*/

a=0x1f;

a=a>>1;/*變成了0x0f,因為它開始的符號位就是0*/。

c語言中c與s的區別,c語言中 c與 s的有什麼區別?

mxx米小夕 c語言中 c格式符表示輸出的是字元 s格式符表示輸出的是字串。c語言基本構成 1.資料型別 c的資料型別包括 整型 字元型 實型或浮點型 單精度和雙精度 列舉型別 陣列型別 結構體型別 共用體型別 指標型別和空型別。2.常量與變數 常量其值不可改變,符號常量名通常用大寫。變數是以某識別...

c語言中for與for有什麼不同

對於問題1 我們只討論迴圈 開始 for i 0 i 2 i i 0 往下執行 for j 0 j 2 j j 0往下執行 for k 0 k 2 k k 0 往下執行 printf d d d n i,j,k 輸出 i j k 顯然輸出的是 0 0 0 輸出後執行 k k值變為1 與2比較 顯然 ...

2 在c語言中表示什麼

你說的應該是printf函式吧 通俗的說 中m標示寬度,n標示小數點後顯示幾位。你的就是顯示5個寬度,其中顯示2位小數。int printf const char format,argument format 引數輸出的格式,定義格式為 flags width perc f n h l type 規...