日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

java右移位_java中的左移 右移

發布時間:2024/7/19 编程问答 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 java右移位_java中的左移 右移 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

1、 左移運算符

左移運算符<

1)它的通用格式如下所示:

value << num

num 指定要移位值value 移動的位數。

左移的規則只記住一點:丟棄最高位,0補最低位

如果移動的位數超過了該類型的最大位數,那么編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了332=1位。

2)運算規則

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

當左移的運算數是int 類型時,每移動1位它的第31位就要被移出并且丟棄;

當左移的運算數是long 類型時,每移動1位它的第63位就要被移出并且丟棄。

當左移的運算數是byte 和short類型時,將自動把這些類型擴大為 int 型。

3)數學意義

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

4)計算過程:

例如:3 <<2(3為int型)

1)把3轉換為二進制數字0000 0000 0000 0000 0000 0000 0000 0011,

2)把該數字高位(左側)的兩個零移出,其他的數字都朝左平移2位,

3)在低位(右側)的兩個空位補零。則得到的最終結果是0000 0000 0000 0000 0000 0000 0000 1100,

轉換為十進制是12。

移動的位數超過了該類型的最大位數,

如果移進高階位(31或63位),那么該值將變為負值。

2、 右移運算符

右移運算符<

1)它的通用格式如下所示:

value >> num

num 指定要移位值value 移動的位數。

右移的規則只記住一點:符號位不變,左邊補上符號位

2)運算規則:

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

當右移的運算數是byte 和short類型時,將自動把這些類型擴大為 int 型。

例如,如果要移走的值為負數,每一次右移都在左邊補1,如果要移走的值為正數,每一次右移都在左邊補0,這叫做符號位擴展(保留符號位)(sign extension ),在進行右移

操作時用來保持負數的符號。

3)數學意義

右移一位相當于除2,右移n位相當于除以2的n次方。

4)計算過程

11 >>2(11為int型)

1)11的二進制形式為:0000 0000 0000 0000 0000 0000 0000 1011

2)把低位的最后兩個數字移出,因為該數字是正數,所以在高位補零。

3)最終結果是0000 0000 0000 0000 0000 0000 0000 0010。

轉換為十進制是2。

35 >> 2(35為int型)

35轉換為二進制:0000 0000 0000 0000 0000 0000 0010 0011

把低位的最后兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000

轉換為十進制: 8

5)在右移時不保留符號的出來

右移后的值與0x0f進行按位與運算,這樣可以舍棄任何的符號位擴展,以便得到的值可以作為定義數組的下標,從而得到對應數組元素代表的十六進制字符。

總結:

對于帶符號右移,若為負數,則在存儲時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變:

對于負數的右移:因為負數在內存中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼(符號位不變,其余位按照原碼取反加1),然后保證符號位不變,其余位向右移動到X位,在移動的過程中,高位補1.等移位完成以后,然后保持符號位不變,其余按位取反加1,得到移位后所對應數的原碼。即為所求。

3、無符號右移

無符號右移運算符>>>

它的通用格式如下所示:

value >>> num

num 指定要移位值value 移動的位數。

無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位

無符號右移規則和右移運算是一樣的,只是填充時不管左邊的數字是正是負都用0來填充,無符號右移運算只針對負數計算,因為對于正數來說這種運算沒有意義

無符號右移運算符>>> 只是對32位和64位的值有意義

例題

【單選】下面函數的輸出結果是什么:

void func() {

int k = 1^(1 << 31 >> 31);

printf("%d\n", k);

}

答案:-2

1算術左移31位變為-128:

1000 0000 0000 0000 0000 0000 0000 0000

-128算術右移31 位變為-1:

1111 1111 1111 1111 1111 1111 1111 1111

-1與1抑或得-2

發現了一個異或1的妙處

?

我們可以直觀的發現,如果是一個偶數^1,那么答案是偶數+1.如果是一個奇數^1,那么答案是奇數-1

總結

以上是生活随笔為你收集整理的java右移位_java中的左移 右移的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。