-
負數為什么要用補碼表示
- 可以將符號位和其它位統一處理
- 減法也可按加法來處理
- 另外,兩個用補碼表示的數相加時,如果最高位(符號位)有進位,則進位被舍棄
- 正數:原碼、反碼、補碼相同。
負數:反碼符號位不變化,其余位數取反,補碼即為反碼+1。 - 假設當前時針指向11點,而准確時間是8點,調整時間可有以下兩種撥法:
一種是倒撥3小時,即:11-3=8
另一種是順撥9小時:11+9=12+8=8
在以模為12的系統中,加9和減3效果是一樣的,因此凡是減3運算,都可以用加9來代替。對“模”12而言,9和3互為補數(二者相加等於模)。所以我們可以得出一個結論,即在有模的計量系統中,減一個數等於加上它的補數,從而實現將減法運算轉化為加法運算的目的。 -
為了顯示一個byte型的單字節十六進制(兩位十六進制表示)的編碼,請使用:
Integer.toHexString((byteVar & 0x000000FF) | 0xFFFFFF00).substring(6)
byteVar & 0x000000FF的作用是,如果byteVar 是負數,則會清除前面24個零,正的byte整型不受影響。(...) | 0xFFFFFF00的作用是,如果byteVar 是正數,則置前24位為一,這樣toHexString輸出一個小於等於15的byte整型的十六進制時,倒數第二位為零且不會被丟棄,這樣可以通過substring方法進行截取最后兩位即可。
-
System.out.println(Integer.toHexString(2));//2 System.out.println(Integer.toHexString(15));//f System.out.println(Integer.toHexString(16));//10 System.out.println(Integer.valueOf("F", 16));//16 //負整數時,前面輸入了多余的 FF ,沒有去掉前面多余的 FF,按並雙字節形式輸出 System.out.println(Integer.toHexString(-2).toUpperCase());//FFFFFFFE //實質上0xFF會像轉換成0x000000FF后再進行位運算 System.out.println(Integer.toHexString(-2 & 0xFF).toUpperCase());//FE System.out.println(Integer.toHexString(-2 & 0x000000FF).toUpperCase());//FE
-
//注,FE輸出時不會為-2,因為此時不會把FE看成負數,valueOf會把所有數字串看成正的 System.out.println(Integer.valueOf("FE", 16));//254 //如果要輸出-2,只能按以下形式輸出 System.out.println(Integer.valueOf("-2", 16));//-2 //所以要把 FE 看成負的話,只能在前面加上負號,但是這里輸出還不是-2, //而是先計算Integer.valueOf("FE", 16),再在結果前加上負 System.out.println(Integer.valueOf("-FE", 16));//-254
-
System.out.println(Integer.valueOf("-80", 16));//-128 System.out.println(Integer.valueOf("7fffffff", 16));//2147483647 //System.out.println(Integer.valueOf("80000000", 16));//不能運行,已注掉 System.out.println(Integer.valueOf("-80000000", 16));//-2147483648
-
System.out.println(Integer.toBinaryString(-2));//11111111111111111111111111111110 System.out.println(Integer.toBinaryString(-2 & 0xFF));//11111110 System.out.println(Integer.toBinaryString(-2 & 0x000000FF));//11111110 System.out.println(Integer.valueOf("1111111111111111111111111111111", 2));//2147483647 //System.out.println(Integer.valueOf("10000000000000000000000000000000", 2)); System.out.println(Integer.valueOf("-10000000000000000000000000000000", 2));//-2147483648 System.out.println(Integer.valueOf("11111110", 2));//254 System.out.println(Integer.valueOf("-11111110", 2));//-254