那些年玩過的 高逼格進制轉換 與 位運算

進制

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

首先呢,瞭解位運算以前,咱們要先指定進制之間的轉換程序員

衆所周知咱們生活中所用的使用的數字是十進制數,而計算機所認識的是二進制算法

因此呢,做爲一個程序員咱們必需要掌握二進制與十進制之間的互轉與運算數組

 

二進制中的一些關鍵字:

1)高位spa

一串二進制串,左面爲高位內存

2)低位字符串

一串二進制串,右面爲低位table

3)原碼擴展

咱們所認識的二進制碼,也就是咱們進制間轉換所獲得的值,咱們認識,但計算機不認識二進制

4)反碼

正數不須要作反碼操做,,,負數的反碼:符號位不變,0110  -------反碼是原碼轉爲補碼的中間過程

5)補碼

計算機所認識並可計算的字節碼,正數的補碼仍是其原碼自己,,負數的補碼是其反碼+1

 

01.正數的原碼,反碼,補碼都一致

02.java中全部的數字都是有符號的  符號位 正數0  負數1

03.負數的反碼=符號位不變+其餘位取反(10 01

04.負數的補碼=反碼+1

 

 

十進制轉二進制

能夠明確的說,只要你會加法你就能夠秒轉

 

先來一張比較牛逼的表:

1024 512 256 128 64 32 16 8 4 2 1

看不懂?不要緊,接下來咱們來講

咱們隨便拿來一個數:765 (爲了說明我這個辦法確實nb,咱們拿了一個比較大一點的數)

咱們已經有表了,那麼,就套表唄

首先找到765最近的一個比他小的數

在他下面寫個1,也就是512

而後依次日後相加,發現相加比765大那麼下面寫0,而後捨去,只而後加下一個(注意是下面寫過1的連續相加)最後能夠得出來:

1024

512 256 128 64  32 16  2 1
  1 0 1 1 1 1 1 1 0 1

 

765的二進制數就是0 1011111101   (最前的0當符號位)

由於是正數因此這既是它的原碼也是它的補碼

那若是是負數呢?-765

簡單,就是拿到其正數的二進制數,改變符號位拿到原碼:

1 1011111101 這個值是咱們轉換的二進制碼

而後取反碼(0110,)

也就是 1(符號位不變   0100000010   而後補碼+1

1 0100000011

-765的補碼就是1 0100000011  這個值是計算機能夠進行計算解析的二進制碼

 

二進制轉十進制

能夠明確的說在這裏你只要會乘法運算,和明白數組下標就會秒轉    或者拿出上面的萬能轉換表

仍是老規矩,隨便寫一個01組成的字符串,而後正負兩種狀況

 

符號位爲正:

隨便一個0符號位的二進制串 (既是原碼也是補碼)

0 1101 ok,發大招,轉換

先忽略符號位,將後面的二進制串咱們當作一個倒着的int類型數組,低位爲0,依次往作+1

古老算法:

當前數*2的下標次方,而後將全部的數相加

那麼這個數就是:

1*20次方+1*22次方+1*23次方=1+4+8= 13

而後加上符號位  

那麼最終值就是+13

 

萬能表算法:

 

1024

512 256 128 64  32 16  2 1
              1 1 0 1

那麼。。。就是  8 +4 +1=13

完美!!!

 

符號位爲負:

若是拿到的是一個原碼,,那就跟上面算法同樣,只不過符號位爲負的而已

若是拿到一個補碼,也就是中間多兩部操做

上面說了,原碼轉補碼是  原碼取反+1

那麼,反推,補碼轉原碼就是。。。補碼-1取反

獲得原碼,再用上面其中一種算法就ok

位運算

算術右移 >>

符號位不變,低位溢出刪除,高位補零!

舉個例子:5>>2 (解析:把五的二進制數右移兩位)

先算出5 的二進制:

0 101   右移兩位,符號位不變

0 00101 低位溢出刪除,高位補零!

最後結果:0 001

轉回十進制就是1

 

若是是負數就是先轉碼而後位移

 

算術左移 <<

符號位不變,高位溢出刪除,低位補零!

舉個例子:5<<2 (解析:把五的二進制數右移兩位)

先算出5 的二進制:

0   101   左移兩位,符號位不變

0 10100 高位溢出刪除,低位補零!

 

最後結果:0 10100

轉回十進制就是20

 

若是是負數就是先轉碼而後位移

 

邏輯右移 >>>

又叫無符號右移

無論符號位!低位溢出刪除,高位補零!

因此呢,,邏輯右移的其值永遠是正數,剩下的跟算術右移大同小異

無符號右移的規則只記住一點:忽略了符號位擴展,0補最高位  無符號右移運算符>>> 只是對32位和64位的值有意義

 

按位與 &

 兩位都爲1,結果爲1

 

5&3

5 二進制:101

3 二進制:011

 

101

& 011

001

 

結果爲1

 

按位或 |

 兩位有一位爲1,結果爲1

 

5|3

5 二進制:101

3 二進制:011

 

101

| 011

111

 

結果爲:7

 

按位異或 ^

 必須是一位是0,一位是1,結果才爲1

 

5^3

5 二進制:101

3 二進制:011

 

101

^ 011

110

結果是:6

 

按位取反 ~

 

~3

3 二進制:0 011

總體取反  1 100

負數。。。補碼轉原碼,原碼轉十進制

-1取反:011 100

符號位爲1,因此最後值:-4

 最後發現,

有個規律:就是數值+1以後取相反的值

相關文章
相關標籤/搜索