關於移位運算子的問題,Java移位運算子問題

2021-03-03 21:57:21 字數 4029 閱讀 7206

1樓:做而論道

右側的引數需要進行《模32的運算》...

這就是求:除以 32,所得到的餘數。

那麼,35,除以 32,餘數,就是 3。

因此,<< 35,就和 << 3,等效。

都是左移 3 位。

都是,乘以 8。

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

1 << 35,左側的 1,應該是指整型數,是 32 位的數字。

一個數字,僅僅才 32 位,對其移位 35 位?

超出了總位數,怎麼移?

所以,就限定,最多就移位 32 位。

超過 1 位,就算移 1 位。

超過 2 位,就算移 2 位。

超過 3 位,就算移 3 位。

……實際的移位個數,就是《模 32》得來的。

java移位運算子問題

2樓:gta小雞

有符號右移

會保留最高位的符號位,從次高位開始逐位右移填0;而無符號右移會將符號位一起右移,並將高位全部填0。

例:對於一個byte型別的數10010100來說,有符號右移2位變為10000101,而無符號右移2位變為00100101。前者仍然是一個負數,而後者變成了正數。

左移只有有符號的,沒有無符號左移。

3樓:幻形術

理解本質才是關鍵,不管有符號還是無符號,不管正數還是負數,都是一樣的原理,正負數在計算機裡存的都是補碼。移位的時候並不關心什麼符號位,只有如下規則:

32位補碼移的位數超過32時,取其對32的餘數來進行移位;

32位補碼左移時,移出去的bit直接去掉,右邊補相應位數的0;

32位補碼右移時,移出去的bit也是直接去掉,但是左邊補相應倍數的1還是0得根據原來最高bit位來看,如果最高位bit位是0則補0,是1則補1。

剩下的32位的最高位,是0就是正數,是1就是負數,當然uint32不管怎麼移就是正的了。不過不管是正是負,終究還是看最終你用的型別,因為有無符號型別是可以強制轉換的。

其實可以發現,補碼右移的補位規則就是為了保證正負數右移不變符號。

而補碼左移補位規則,在有溢位的情況下,正負號是可能會變的,但是至少能保證在不溢位情況下,正負不會變。

4樓:最新資訊資料

學習java本來就是一件日積月累的事情,或許你通過自學能掌握一些皮毛技術,通過java學習機構學到java的一些基本大面,但想要做到精通,還是需要自己技術的日積月累和工作經驗的不斷積累。

今天給大家分享的技術知識是:java中的位移運算子!

1) 「有符號」左移位運算子(<<)能將運算子左邊的運算物件向左移動運算子右側指定的位數(在低位補0)。

左移移位相當於乘以2,例如

3 << 2 //12 則是將數字3左移2位 3*2*2 = 3*(2的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次方。

2) 「有符號」右移位運算子(>>)則將運算子左邊的運算物件向右移動運算子右側指定的位數。 「有符號」右移位運算子使用了「符號擴充套件」:若值為正,則在高位插入0;若值為負,則在高位插入1。

>>運算規則:按二進位制形式把所有的數字向右移動對應位數,低位移出(捨棄),高位的空位補符號位,移位後得到的數字為正數則補0,負數補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次方。

3) java也新增了一種「無符號」右移位運算子(>>>),它使用了「零擴充套件」:無論正負,都在高位插入0

4)右移一位相當於除以2,左移一位(在不溢位的情況下)相當於乘以2;移位運算速度高於乘除運算。

5)位運算子的優先順序

~的優先順序最高,其次是<<、>>和》,再次是&,然後是^,優先順序最低的是|。

位移位運算子

5樓:淺不可測

要了解移位運算,需明白二進位制計數

以單位元組為例,比如0x55=0b01010101

如果將該數值左移1位,就變成了 0b10101010(最右邊這個0是移空了以後補的),這個數值是0xaa

從數學上看,左移1位等於乘以2,右移1位等於除以2,然後再取整,移位溢位的丟棄。

例如:unsigned char a;

a=1; //0b00000001

a<<=1; //0b00000010 a左移1位等效於a=a*2

a<<=2; //0b00001000 a左移2位等效於a=a*2的2次方(4)

a<<=3; //0b01000000 a左移1位等效於a=a*2的3次方(8)

a<<=1; //0b10000010 a左移1位等效於a=a*2

a<<=1; //0b00000000 a再次左移1位後溢位了,結果變成0了

c=a<

什麼情況下使用移位運算子

6樓:匿名使用者

各種編碼,編碼間的轉換時都會用到。

無論是字元編碼,比如

7樓:匿名使用者

通常用在底層開發裡面,當然在應用中也可以使用例如一個數 / 2 可寫為 數 >> 1,移位操作效率更高然如果一個數 * 2 定為 數 << 1,但如 / 2 的n次方,則可 數 >> n

當然還有很多作用,可在網上搜尋一些例子看

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

8樓:可愛小爬爬

原因:第一個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列印出的就是這個結果

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

9樓:

void main()

void main()

10樓:樸丹樊鳥

a沒有變啊,b=a

<<3的意思是把a左移後的結果賦值給b就像b

=a+3;

b的值是a+3但是a本身沒有加3的!

11樓:匿名使用者

#include"stdio.h"

void main()

#include"stdio.h"

void main()

12樓:

char ch='e'; 十六進位制0x65'e' 等於 二進位制 0110 0101

ch=ch<<4;

左移4位 得 二進位制 0101 0000

(高位0110 溢位, 自動丟失)

賦還到ch裡.

二進位制 0101 0000 是 p, 十六進位制 0x50#include

void main()

java運算子加括號怎麼算,c運算子與什麼等效

a 如果 在前就會先把a 1。a 如果 在後就會先a然後在執行 的操作。int a 1 system.out.pritln a 輸出2int s 1 system.out.println s 輸出1system.out.println s 上次執行的後 這次才輸出2 author roc老周 pub...

java中的位運算子及其用法,Java中位運算子的具體應用是什麼,在實際程式設計中有什麼作用

位邏輯運算子有 與 and 或 or 異或 xor 非 not 分別用 表示。下面的例子說明了位邏輯運算子 demonstrate the bitwise logical operators.class bitlogic int a 3 0 2 1 or 0011 in binary int b 6...

java中這些運算子是什麼意思,java運算子是什麼意思

運算子指明對運算元的運算方式。組成表示式的java操作符有很多種。運算子按照其要求的運算元數目來分,可以有單目運算子 雙目運算子和三目運算子,它們分別對應於1個 2個 3個運算元。運算子按其功能來分,有算術運算子 賦值運算子 關係運算子 邏輯運算子 位運算子和其他運算子。1 算術單目 取正 取負 自...