左移運算子的問題c左移運算子的問題C

2021-03-05 09:22:04 字數 5620 閱讀 7295

1樓:匿名使用者

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

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

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

2樓:

00001110左移時,00001110最左邊的兩個位元組被「擠出去」了,成了001110_ _,這時候最右邊空出來了兩個位,應該用0補上。即001111(0)(0),()表示補上去的兩個0。即00111000

在c++位運算裡什麼是左移位和右移位

3樓:匿名使用者

移位操作在程式設計中,位操作運算子的一種。

1.在c++中,移位運算子有雙目移位運算子:<<(左移)和>>(右移)。移位運算子組成的表示式也屬於算術表示式,其值為算術值。

2.左移運算是將一個二進位制位的運算元按指定移動的位數向左移位,移出位被丟棄,右邊的空位一律補0。3.

右移運算是將一個二進位制位的運算元按指定移動的位數向右移動,移出位被丟棄,左邊移出的空位或者一律補0,或者補符號位,這由不同的機器而定。在使用補碼作為機器數的機器中,正數的符號位為0,負數的符號位為1。

4樓:匿名使用者

左移位就是比如二進位制 0000 1011 左移一位就是 0001 0110,相當於乘2

右移位類似, 0000 1011 右移一位就是 0000 0101,相當於除2

請問c++中運算子<<(左移)和*(乘)優先順序哪個高,請教各位高人

5樓:小灬寶丶

c++的優先順序

優先順序 操作符 結合性

1 :: 左

2 . -> () 左

3 ++ -- ~ ! - + & * () sizeof new delete castname_cast單目操作符 右

4 .* ->* 左

5 * / % 左

6 + - 左

7 << >> 左

8 < <= > >= 左

9 == != 左

10 & 左

11 ^ 左

12 | 左

13 && 左

14 || 左

15 ?: 右

16 = *= /= %= += -= <<= >>= &= |= ^= 右

17 throw 左

18 , 左

左移運算子 右移運算子的意義

6樓:匿名使用者

在沒有溢位的前提下:

左移n位等於乘以2的n次方

右移n位等於整除2的n次方

7樓:暴凝荷冒婧

移位運算子就是在二進位制的基礎上對數字進行平移。按照平移的方向和填充數字的規則分為三種:

<<(左移)、>>(帶符號右移)和》(無符號右移)。

在移位運算時,byte、short和char型別移位後的結果會變成int型別,對於byte、short、char和int進行移位時,規定實際移動的次數是移動次數和32的餘數,也就是移位33次和移位1次得到的結果相同。移動long型的數值時,規定實際移動的次數是移動次數和64的餘數,也就是移動66次和移動2次得到的結果相同。

三種移位運算子的移動規則和使用如下所示:

<<運算規則:

按二進位制形式把所有的數字向左移動對應的位數,高位移出(捨棄),低位的空位補零。

語法格式:

需要移位的數字

<<移位的次數

例如:3

<<2,則是將數字3左移2位

計算過程:

3<<2首先把3轉換為二進位制數字0000

0000

0000

0000

0000

0000

0000

0011,然後把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,最後在低位(右側)的兩個空位補零。則得到的最終結果是0000

0000

0000

0000

0000

0000

0000

1100,則轉換為十進位制是12。

數學意義:

在數字沒有溢位的前提下,對於正數和負數,左移一位都相當於乘以2的1次方,左移n位就相當於乘以2的n次方。

>>運算規則:

按二進位制形式把所有的數字向右移動對應巍峨位數,低位移出(捨棄),高位的空位補符號位,即正數補零,負數補1。

語法格式:

需要移位的數字

>>移位的次數

例如11

>>2,則是將數字11右移2位

計算過程:

11的二進位制形式為:0000

0000

0000

0000

0000

0000

0000

1011,然後把低位的最後兩個數字移出,因為該數字是正數,所以在高位補零。則得到的最終結果是0000

0000

0000

0000

0000

0000

0000

0010。轉換為十進位制是3。

數學意義:

右移一位相當於除2,右移n位相當於除以2的n次方。這裡是取商哈,餘數就不要了。

>>>運算規則:

按二進位制形式把所有的數字向右移動對應位數,低位移出(捨棄),高位的空位補零。對於正數來說和帶符號右移相同,對於負數來說不同。

其他結構和》相似。

8樓:

計算機運算中:乘除都很耗記憶體,可用左移、右移來代替,運算速度會快很多。。

9樓:

1<<1; 1左移一位:= 2;(0010)

1<<3; 1左移三位:= 8;(1000)

右移類推。

c++按位左移運算子怎麼用

10樓:小呆瓜

比如int n=4;轉化成二進位制就是0000 0100,那左移一位n<<1就是0000 1000得到8,又移一位就是0000 0010得到2,移動幾位就是原始資料的幾倍或幾分之一

11樓:lo創世的大天使

要左移的數《往左移多少位

c語言中關於左移<<運算子的問題

12樓:可愛小爬爬

原因:第一個k<<1只是表示k左移一位,但是這個運算結果並沒有給k而是依舊儲存在計算機cpu中的運算器中,同時你是用%d將這個結果列印出來,用%d格式表示把這個結果看成了int型,即型別擴大為int型,k<<1相當於2*k,在int型中65534沒有出界,所以就是這個結果。

第二個j<<=1;等價於j=j<<1;你看運算的結果給了j,而j是short int型,所以此時j=1111111111111110(最後一位為補進的0),而short int 最多是16位,這樣它的最高位為1,所以是負數,這是個補碼,其原碼為-(1111111111111110-1)按位取反,即為-0000000000000010=-2,最後用%d列印出的就是這個結果

左移運算子的計算方法

13樓:玉壺

左移表示式的位  result = expression1 << expression2

引數 result

任何變數。

expression1

任何表示式。

expression2

任何表示式。

說明:《運算子把expression1的所有位向左移expression2指定的位數。例如:

var temp temp = 14 << 2 變數temp的值為 56,因為 14 (即二進位制的 00001110)向左移兩位等於 56 (即二進位制的 00111000)。

簡單介紹一種方便計算的方法:

8 << 1的值為8*2=16;

8 << 2的值為8*(2^2)=32;

8 << n的值為8*(2^n)。

c++中的左移右移運算有什麼作用

14樓:匿名使用者

首先在計算機中,不管是數字還是字母或者符號,都用一個特定的二進位制碼來表示,左移右移可以直接操縱二進位制碼,對於一些數字的處理非常方便,比如十進位制的5用二進位制表示為101,那麼想變成10則左移一位,空位用0補充就變成了1010;如果想計算5/2取整,則直接右移一位變成010,就是2

15樓:匿名使用者

可以快速地將物件乘2、4、8或除

C 複合賦值運算子問題,c語言,複合賦值運算子

執行順序 1 a 1 2 2.a被替換為31 31 1 23.計算後得到 31 2 15 小數被忽略 4.a a 1 31 1 32最後a 32,表示式a 1 2 15 a x等價與a a x 所以a a a a就等價於a a a a a a x等價與a a x 所以,又有a a a a a 等價於...

c語言賦值運算子,C語言賦值運算子

a a a a 分步 1 a a a a a 9 a 9 a a 9,a 6 2 a 6 a 6 6 a 12a a a a 1 a a a 9 2 a 9 a 9 9 a 0 3 a 0 a 0 在c語言中11種賦值運算子的具體含義,用法?1.六個變數 表示式的賦值 是賦值運算子,是除後賦值,是乘...

c中運算子《是幹什麼用的,C中運算子和運算子有什麼區別

在沒有過載的情況下,運算元都是整數時,是位移運算。這個例子中就是將i這個整數表示成的二進位制數左移k個位置,右邊補0。位運算的 就是向左移幾位 你的程式有未定義行為,最好不要用 輸出運算子,相當於printf c 中 運算子和 運算子有什麼區別 是左移運算子號,是把運算元看成二進位制數,然後左移指定...