1. 程式人生 > >【數字邏輯】理解位運算子

【數字邏輯】理解位運算子

<<、>>、>>>是三種位運算子:

<<    左移運算子,num << n,相當於num乘以2的n次冪

>>    右移運算子,num >> n,相當於num除以2的n次冪

>>>  無符號右移,忽略符號位,空位都以0補齊(只對32位和64位有意義)

現在我們知道了這幾個運算子大概是做什麼的,再來看看例子:

首先我們需要知道十進位制怎麼轉二進位制,正數這裡就不解釋了,我們看看負數的情況:

以 -9 為例子: 9的二進位制是 1001,再按位取反,即0110,再加一得到0111。-9的二進位制就是0111了。

(1) << 運算子 ,a << b,二進位制左移b位後,低位補0

   9 << 2      0000  0000  0000  0000  0000  0000  0000  1001

   左移兩位  0000  0000  0000  0000  0000  0000  0010  0100

   即十進位制36

 

  -9 << 2       1111  1111  1111  1111  1111  1111  1111  0111

   左移兩位   1111  1111  1111  1111  1111  1111  1101  1100

   減一取反   0000 0000 0000 0000 0000 0000 0010 0100  即十進位制-36

 

(2)>>運算子,a >> b,二進位制右移b位,低位去掉,正數時高位補0,負數時高位補1

   9 >> 2        0000  0000  0000  0000  0000  0000  0000  1001

   右移兩位    0000  0000  0000  0000  0000  0000  0000  0010(高位補0)

   即十進位制2

 

  -9 >> 2        1111  1111  1111  1111  1111  1111  1111  0111

   右移兩位    1111  1111  1111  1111  1111  1111  1111  1101(高位補1)

   減一取反    0000 0000 0000 0000 0000 0000 0000 0011   即十進位制-3

 

(3)>>>運算子,a >>> b,無符號右移,只對32位和64位有意義,二進位制右移b位,低位去掉,正數和負數高位都補0

   9 >>> 2      0000  0000  0000  0000  0000  0000  0000  1001

   右移兩位    0000  0000  0000  0000  0000  0000  0000  0010(高位補0)

   即十進位制2

 

  -9 >>> 2      1111  1111  1111  1111  1111  1111  1111  0111

  右移兩位     0011  1111  1111  1111  1111  1111  1111  1101(高位補0)

  即十進位制1073741821