(轉)二進位相關基礎

來源:互聯網
上載者:User

轉載:https://mp.weixin.qq.com/s?__biz=MzU2NjIzNDk5NQ==&mid=2247483797&idx=1&sn=18579f6a4e319b6adefc02520a59e2bc&scene=21#wechat_redirect

golang的基礎資料型別 (Elementary Data Type)-整型

種類
 有符號(負號)
 1. int8 int16 int32 int64

無符號(無符號)
 1. uint8 uint16 uint32 uint64

架構特定(取決於系統位元)
 1. int uint

類型別名
 1. Unicode字元rune類型等價int32
 2. byte等價uint8

特殊類型
 1. uintptr,無符號整型,
 2. 由系統決定佔用位大小,足夠存放指標即可,和C庫或者系統介面互動

取值範圍

具體類型 取值範圍 所佔位元
int8 -128到127 8
uint8 0到255 8
int16 -32768到32767 16
uint16 0到65535 16
int32 -2147483648到2147483647 32
uint32 0到4294967295 32
int64 -9223372036854775808到9223372036854775807 64
uint64 0到18446744073709551615 64

備忘:1位元組=8位(1 byte = 8bit)

整數的表示

  • 原碼:第一位為符號位(0表示正數,1表示負數)。

  • 反碼:符號位不動,原碼取反。

  • 負數補碼:符號位不動,反碼加1。

  • 正數補碼:和原碼相同。

備忘:補碼的好處:
* 使用補碼可以沒有任何歧義的表示0。
* 補碼可以很好的參與二進位的運算,補碼相加符號位參與運算,這樣就簡單很多了。

浮點型

主要為了表示小數
也可細分float32和float64兩種
float64提供比float32更高的精度

取值範圍

類型 最大值 最小非負數
float32 3.402823466385288598117041834516925440e+38 1.401298464324817070923729583289916131280e-45
float64 1.797693134862315708145274237317043567981e+308 4.940656458412465441765687928682213723651e-324

IEEE745單精確度浮點格式共32位,包含三個構成欄位:23位小數f,8位偏置指數e,1位符號s。將這些欄位連續存放在一個32位字裡,並對其進行編碼。其中0:22位包含23位的小數f; 23:30位包含8位指數e;第31位包含符號s。


image.png

一個實數V在IEEE 754標準中可以用V=(-1)s×M×2E 的形式表示,說明如下:

  • 符號s(sign)決定實數是正數(s=0)還是負數(s=1),對數值0的符號位特殊處理。
  • 有效數字M(significand)是二進位小數,M的取值範圍在1≤M<2或0≤M<1。
  • 指數E(exponent)是2的冪,它的作用是對浮點數加權。
符號位 指數位 小數位
1位 8位 23位

例如根據IEEE745,計算11000001000100000000000000000000的單精確度浮點的值。

解題:

1 10000010 00100000000000000000000
符號位 指數 尾數由於指數不是全部為0 所以小數位附加1
1 10000010 1.00100000000000000000000
-1 2^(130-127) (2^0 + 2^-3)

結論:-1 * (2^0 + 2^-3) * 2^(130-127) =-9

同樣,你也可以驗證一下十進位浮點數0.1的二進位形式是否正確,你會發現,0.1不能表示為有限個二進位位,因此在記憶體中的表示是舍入(rounding)以後的結果,即 0x3dcccccd, 十進位為0.100000001, 誤差0.000000001由此產生了。

進位的概念

我們常用的進位有二進位、八進位、十進位和十六進位,十進位是最主要的表達形式。

二進位是0和1;八進位是0-7;十進位是0-9;十六進位是0-9+A-F(大小寫均可)。

位元運算符

按位與(&)

兩位全為1,結果才為1:

0&0=0;
0&1=1;
1&0=0;
1&1=1;

用法:

  • 清零:如果想要一個單位清零,那麼使其全部二進位為0,只要與一個各位都為零的數值想與,結果為零。

  • 取一個數中指定位:找一個數,對應X要取的位,該數的對應位為1,其餘位為零,此數與X進行“與運算”可以得到X中的指定位。

例如:設X=1010 1110,取X的低4位,用X & 0000 1111 = 0000 1110 就可以得到。

按位或(|)

只要有一個為1,結果就為1:

0|0=0;
0|1=1;
1|0=1;
1|1=1;

用法:常用來對一個資料的某些位置1;找到一個數,對應X要置1的位,該數的對應位為1,其餘位為零。此數與X相或可使X中的某些位置1。

例如:將X=1010 0000 的低四位置1,用X | 0000 1111 =1010 1111 就可以得到。

異或運算(^)

兩個相應位為“異”(值不同),則該位結果為1,否則為0:

0^0=0;
0^1=1;
1^0=1;
1^1=0;

用法:

  • 使特定位翻轉:找一個數,對應X要翻轉的各位,該數的對應位為1,其餘位為零,此數與X對應位異或就可以得到; 例如:X=1010 1110,使X低4位翻轉,用X ^ 0000 1111 = 1010 0001就可以得到

  • 與0相異或,保留原值 例如:X ^ 0000 0000 = 1010 1110

  • 兩個變數交換值的方法: 1、藉助第三個變數來實現: C=A; A=B; B=C; 2、 利用加減法實現兩個變數的交換:A=A+B; B=A-B;A=A-B; 3、用位異或運算來實現:利用一個數異或本身等於0和異或運算子合交換律 例如:A = A ^ B; B = A ^ B; A = A ^ B;

取反運算(~)

對於一個位元按位取反,即將0變1,1變0: ~1=0; ~0=1;

左移運算(<<)
  • 將一個運算對象的各二進位位全部左移若干位(左邊的二進位丟棄,右邊補零) 2<<1 = 4 : 10 <<1 =100=4

  • 若左移時捨棄的高位不包括1,則每左移一位,相當於該數乘以2。 -14(二進位:1111 0010)<< 2= (1100 1000) (高位包括1,不符合規則)

右移運算(>>)(<<)

將一個數的各二進位位全部右移若干位,正數左補0,負數左補1,右邊丟棄。運算元每右移一位,相當於該數除以2.

左補0 or 補1 得看被移數是正還是負。
例:4 >> 2 = 1
例:-14(1111 0010) >> 2 = -4 (1111 1100 )

無符號右移運算(>>>)

各個位向右移指定的位元。右移後左邊突出的位用零來填充。移出右邊的位被丟棄
各個位向右移指定的位元。右移後左邊突出的位用零來填充。移出右邊的位被丟棄
例如: -14>>>2
即-14(1111 1111 1111 1111 1111 1111 1111 0010)>>> 2
=(0011 1111 1111 1111 1111 1111 1111 1100)
= 1073741820

說明:

  • 0x80000000是數的十六進位表示,轉成二進位表示為10000000000000000000000000000000
  • 運算的優先順序,移位元運算高於邏輯運算,>>>高於&
  • 位邏輯與運算 1&1 = 1 ,0&1 = 0
  • '>>>'無符號右移,移出部分捨棄,左邊位補0;
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.