1. 程式人生 > >Java移位運算

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位),那麼該值將變為負值。下面的程式說明了這一點:

// Left shifting as a quick way to multiply by 2.
public class MultByTwo {
public static void main(String args[]) {
   int i;
   int num = 0xFFFFFFE;
   for(i=0; i<4; i ) {
       num = num << 1;
     System.out.println(num);
   }
  }
}

該程式的輸出如下所示:

536870908
1073741816
2147483632
-32
注:n位二進位制,最高位為符號位,因此表示的數值範圍-2^(n-1) ——2^(n-1) -1,所以模為2^(n-1)。

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。
轉換為十進位制是3。

35 >> 2(35為int型)
35轉換為二進位制:0000 0000 0000 0000 0000 0000 0010 0011 
把低位的最後兩個數字移出:0000 0000 0000 0000 0000 0000 0000 1000
轉換為十進位制: 8

5)在右移時不保留符號的出來
右移後的值與0x0f進行按位與運算,這樣可以捨棄任何的符號位擴充套件,以便得到的值可以作為定義陣列的下標,從而得到對應陣列元素代表的十六進位制字元。
例如
public class HexByte {
public static public void main(String args[]) {
char hex[] = {
'0', '1', '2', '3', '4', '5', '6', '7',
'8', '9', 'a', 'b', 'c', 'd', 'e', 'f''
};
byte b = (byte) 0xf1;
System.out.println("b = 0x" hex[(b >> 4) & 0x0f] hex[b & 0x0f]);}}

(b >> 4) & 0x0f的運算過程:
b的二進位制形式為:1111 0001
4位數字被移出:0000 1111
按位與運算:0000 1111
轉為10進位制形式為:15

b & 0x0f的運算過程:
b的二進位制形式為:1111 0001
0x0f的二進位制形式為:0000 1111
按位與運算:0000 0001
轉為10進位制形式為:1

所以,該程式的輸出如下:
b = 0xf1


3、無符號右移
無符號右移運算子>>>
它的通用格式如下所示:
value >>> num
num 指定要移位值value 移動的位數。
無符號右移的規則只記住一點:忽略了符號位擴充套件,0補最高位
無符號右移運算子>>> 只是對32位和64位的值有意義


相關推薦

JAVA移位運算

右移 符號 補齊 進制 ava 運算符 三種 移位運算 num java中有三種移位運算符(二進制) << : 左移運算符,num << 1,相當於num乘以2 >> : 右移運算符,num >&

Java移位運算中,數值右端的低5位才有用

Java移位運算中,數值右端的低5位才有用 晚上糾結了很久這個問題,不懂為什麼低5位才有用,怎麼就2^5等於32位,跟int的32位掛上鉤了,思考了很久終於明白了。 這段話有兩個出處: 一個是Java程式設計思想3.11移位操作符中出現,原話是“只有數值右端的低5位才有用”。 一個是

Java 移位運算(、>>>)

位移運算 Java位移運算主要有三種: (1)左移:<< vluse<<num;//num 指定要移位值value 移動的位數規則: 1)丟棄最高位,低位補0; 2)如果移

Java移位運算

java移位運算子不外乎就這三種:<<(左移)、>>(帶符號右移)和>>>(無符號右移)。 1、 左移運算子 左移運算子<<使指定值的所有位都左移規定的次數。 1)它的通用格式如下所示: value <&l

JAVA移位運算與進位制轉換

關於資料的基礎知識 眾所周知,在計算機中,資料都是以2進位制的方式儲存。舉個最最最簡單的例子 10進位制整數 1 以2進製表示 1 10進位制整數 2 以2進製表示為10 10進位制整數 16 以2進製表示為10000 這樣看起來很簡單

Java運算(移位、位與、或、異或、非)(轉)

位與 異或 print 我們 如果 運行 str 換算 system public class Test { public static void main(String[] args) { // 1、左移( << ) // 0000 0000 00

移位運算、Arrays中的copyOf、java.util.AbstractCollection、linux命令之tail

xca eid width gte 技術分享 blank strac eba tail 移位運算:http://www.cnblogs.com/hongten/p/hongten_java_yiweiyunsuangfu.html。 ---------- Arrays中的c

Java運算(移位、位與、或、異或、非)與邏輯運算

高效率 邏輯與 才會 system 區別 span get 右移 邏輯 java 位運算包括:左移( << )、右移( >> ) 、無符號右移( >>> ) 、位與( & ) 、位或( | )、位非( ~ )、位異或( ^

韓順平 java筆記 第20講 二進制 位運算 移位運算

反碼 方式 body 符號位 blog amp 韓順平 移位 按位異或 1.對於有符號的而言   二進制的最高位是符號位,1表示整數 1表示負數   正數的源碼 反碼 補碼都一樣   負數的反碼 = 它的源碼符號位不變,其他位去反   負數的補碼 = 它的反碼+1   0

java中的無符號移位運算

color 位運算 沒有 區分 進制 ger 存在 pri 符號 1. 無符號右移 >>> 或 >>> = 無符號右移(>>>)跟右移(>>)運算符不一樣。 右移不改變數的正負。 對於一個正數,無符號右

關於java原碼,補碼,反碼和移位運算的一些總結

整數的原碼,補碼,反碼是一致的 負數的反碼=原碼取反(符號為不變) 負數的補碼=負數的反碼+1; 重點:在JAVA裡,使用8進位制和16進位制給一個int值賦值時,是直接存的補碼!!!並且運算時也是採取補碼的形式運算。 下面為測試例子: 0x82表示為2進位制:10000010,如果0x8

Java的三種移位運算

1、Java移位運算子有一下三種: ① <<   : 左移運算子,num << 1,相當於num乘以2 ② >>   : 右移運算子,num >> 1,相當於num除以2 ③ &g

java使用移位運算進行進位制轉化

最近在練習進位制轉換演算法,學習了一種使用移位運算進行進位制的方法分享給大家。 16進位制轉換8進位制 問題描述: 輸入格式 輸入的第一行為一個正整數n (1<=n<=10)。

Java移位運算

以前一直沒有研究二進位制的移位運算的應用場景是什麼,怎麼運算?怎麼實現資料的四則運算的? 直到最近,在看Think in Java的書籍,才真正理解這個東西。下面記錄一下學習筆記。 1,二進位制 1.1 二進位制的表示 我們知道,計算機中所有

大資料Java基礎——移位運算的真實剖析 (一)

  拋磚引玉:   Java 中定義了 3 種移位運算子,分別是左移運算子“<<”、右移運算子“>>”和無符號右移運算子“>>>”,對於移位運算,移位運算兩邊的運算元要求為整型,即 byte、short、char、 i

java 簡單認識移位運算符和位運算

demo code 情況下 二進制 操作符 認識 class 簡單 == 移位運算符和位運算符本質上都是操作二進制位,因為計算機存儲的是二進制數據,運算效率相對較高。 移位運算符:把整數的二進制位進行左移或右移 .左移一位,相當於這個數乘以2, 右移一位,相當於這個數除以

java 大數運算[轉]

運算 不能 for 相加 emp -- test return pack 用JAVA 實現算術表達式(1234324234324 + 8938459043545)/5 + 343434343432.59845 因為JAVA語言中的long 定義的變量值的最大數受到限制,例

Java運算符 深入理解

clas 簡單的 二進制 ava white 最簡 bit ont 基於 在Java中存在著這樣一類操作符,是針對二進制進行操作的。它們各自是&、|、^、~、>>、<<、>>>幾個位操作符。不管是初始

Java精確運算(BigDecimal)

necessary ring ext col ons 詳細 opera 字段 str (1)、浮點數精確計算 勝利油田三流合一項目中一直存在一個問題,就是每次報表統計的物資金額和實際的金額要差那麽幾分錢,和實際金額不一致,讓客戶覺得總是不那麽舒服,原因是因為我們使用j

C++ 移位運算與進制轉換 淺析

十進制 ng- ostream font col urn line 繼續 adding 移位運算包括“邏輯移位”(logical shift)和“算術移位”(arithmetic shift)。 邏輯移位:移出去的位丟棄,空缺位(vacant bit)用 0 填充。