1. 程式人生 > >Java千百問_03基本的語法(005)_二進制是如何做位運算的

Java千百問_03基本的語法(005)_二進制是如何做位運算的

無符號 img 進制 amp 取整 查找 進行 href 有符號

點擊進入_很多其它_Java千百問


二進制是如何做位運算的

程序中的全部數在計算機內存中都是以二進制的形式儲存的。位運算說白了,就是直接對整數在內存中的二進制進行操作。

其它運算符看這裏:java種的運算符都有哪些

大部分運算流程都是先將整數轉換為二進制。然後進行對應二進制操作。常見的操作有例如以下幾種:
技術分享
以下我們具體說明,運算符的優先級看這裏:java運算符的優先級是如何的

1、按位與 and
兩個二進制數進行按位與操作:同樣位的兩個數字都為1。則為1;若有一個不為1,則為0。


比如:00101 & 11100 = 00100
通經常使用於二進制取位操作,比如一個數 & 1的結果就是取二進制的最末位
這能夠用來推斷一個整數的奇偶。二進制的最末位為0表示該數為偶數。最末位為1表示該數為奇數。



2、按位或 or
兩個二進制數進行按位或操作:同樣位僅僅要一個為1即為1。


比如:00101 | 11100 = 11101
通經常使用於二進制特定位上的無條件賦值,比如一個數 | 1的結果就是把二進制最末位強行變成1。


假設須要把二進制最末位變成0,對這個數 | 1之後再減一就能夠了。事實上際意義就是把這個數強行變成最接近的偶數。

3、按位異或 xor
兩個二進制數進行按位異或操作:同樣位不同則為1,同樣則為0。
比如:00101 ^ 11100 = 11001
異或運算能夠用於簡單的加密。是由於xor運算的逆運算是它本身。也就是說兩次異或同一個數最後結果不變。即(a xor b) xor b = a。


比方我想對某人說1314520,但怕別人知道,於是兩方約定拿生日 19871112作為密鑰。1314520 xor 19871112 = 20659024。我就把20659024告訴MM。MM再次計算20659024 xor 19871112的值,得到1314520。


4、按位取反 not
對一個二進制數進行按位取反操作:每一位的0變為1。1變為0。
比如:~ 0011 1100 = 1100 0011
使用not運算時要格外小心。你須要註意整數類型有沒有符號

假設not的對象是無符號整數(不能表示負數),那麽得到的值就是它與該類型上界的差,由於無符號類型的數是用00到$FFFF依次表示的。



5、左移
對一個二進制數進行左移操作:a << b就表示把a轉為二進制後左移b位(在後面添b個0)。左移是不區分有無符號的。
比如: 1100100 << 2 = 110010000,即100 << 2 = 400。
能夠看出。a << b的值實際上就是a乘以2的b次方,由於在二進制數後添一個0就相當於該數乘以2。


通常覺得a << 1比a * 2更快,由於前者是更底層一些的操作。因此程序中乘以2或者2的倍數的操作請盡量用左移一位來取代。


定義一些常量可能會用到shl運算。

你能夠方便地用1 << 16 - 1來表示65535。

6. 帶符號右移
對一個二進制數進行無符號右移操作:a >> b就表示把a轉為二進制後右移b位,符號位保持不變。
比如: 1100100 >> 2 = 11001,即100 >> 2 = 25。


和<<類似,相當於a除以2的b次方(取整)。

我們也經經常使用<< 1來取代除以 2,比方二分查找、堆的插入操作等等。
想辦法用<<取代除法運算能夠使程序效率大大提高。最大公約數的二進制算法用除以2操作來取代慢得出奇的mod運算,效率能夠提高60%。

7.無符號右移
對一個二進制數進行帶符號右移操作:a >> b就表示把a轉為二進制後右移b位。符號位也要參與移動。移動後高位補0。


僅僅是對32位和64位的值有意義。

點擊進入ooppookid的博客

Java千百問_03基本的語法(005)_二進制是如何做位運算的