二進位補碼(Binary Two's Complement)是一種表示有符號整數的方法,在電腦中廣泛使用。它是通過對正數取反加一得到負數的表示方式。 在二進位補碼表示中,一個固定位數的整數由固定數量的二進位位表示,其中最高位被用作符號位。對於N位的二進位補碼表示,最高位(最左側的位)為符號位,0表 ...
二進位補碼(Binary Two's Complement)是一種表示有符號整數的方法,在電腦中廣泛使用。它是通過對正數取反加一得到負數的表示方式。
在二進位補碼表示中,一個固定位數的整數由固定數量的二進位位表示,其中最高位被用作符號位。對於N位的二進位補碼表示,最高位(最左側的位)為符號位,0表示正數,1表示負數。
正數的二進位補碼表示與其二進位原碼表示相同。例如,十進位數3的二進位補碼表示為00000011
。
負數的二進位補碼表示通過以下步驟獲得:
- 將對應正數的二進位表示取反,即將0變為1,將1變為0。
- 對取反後的結果加1。
例如,十進位數-3的二進位補碼表示為11111101
。以下是對應步驟的說明:
- 正數3的二進位表示是
00000011
。 - 取反得到
11111100
。 - 加1得到
11111101
,即-3的二進位補碼表示。
使用二進位補碼的好處是可以將正數和負數的加法、減法等運算轉化為相同的二進位操作,簡化了電腦的運算邏輯。
需要註意的是,二進位補碼表示中的最小負數的絕對值比最大正數的絕對值多一個單位,這是由於二進位補碼表示中,負數的範圍比正數的範圍多一個。例如,在8位的二進位補碼表示中,最小的負數是-128,而最大的正數是127。
容易搞混
- java里byte是有符號的整數,它占用的存儲空間為1個位元組,即8位,使用8個二進位數表示,也可以用2個16進位數表示,取值為-128~127
- java里沒有無符號的byte[],如果你非要表示無符號的,那需要使用short/int類型來表示,就是使用integer的8位,通過
int unsignedByte = byteValue & 0xFF;
可以得到無符號的byte值
byte[]來表示int數字
通過byte[4]來表示一個int數字,byte[4]就是4個位元組的意思,每個byte[0]表示一個欄位,取值都是-128~127,可以測試一下
log.info("{}", Bytes.toBytes(256));// [0, 0, 1, 0]
log.info("{}", Bytes.toBytes(255));// [0, 0, 0, -1]
log.info("{}", Bytes.toBytes(128));// [0, 0, 0, -128]
log.info("{}", Bytes.toBytes(129));// [0, 0, 0, -127]
log.info("{}", Bytes.toBytes(-1));// [-1, -1, -1, -1]
log.info("{}", Bytes.toBytes(127));// [0, 0, 0, 127]
從上面的代碼中,我們看到一個int類型的-1通過byte[]表示為[-1,-1,-1,-1],它是取-1的補碼,再加1得到的。
作者:倉儲大叔,張占嶺,
榮譽:微軟MVP
QQ:853066980
支付寶掃一掃,為大叔打賞!