關於Java中進位制轉換以及位運算問題

GOZO發表於2024-06-08

java中進位制轉換問題
----------------------
什麼是二進位制?
二進位制是一種數值表示系統,基數為2,使用兩個符號(0和1)表示所有的數值。每一位的值都是2的冪次倍。
什麼是八進位制1?
八進位制是一種數值表示系統,基數為8,使用八個符號(0到7)表示所有的數值。每一位的值都是8的冪次倍。
什麼是十進位制?
十進位制是一種數值表示系統,基數為10,使用十個符號(0到9)表示所有的數值。每一位的值都是10的冪次倍。
什麼是十六進位制?
十六進位制是一種數值表示系統,基數為16,使用十六個符號(0到9和A到F)表示所有的數值。每一位的值都是16的冪次倍。A到F分別表示10到15。


二進位制->八進位制
轉換步驟:
將二進位制數每三位一組進行分組:

從右到左開始將二進位制數每三位分成一組。如果最後一組不足三位,可以在左邊補零。
將每組三位二進位制數轉換為一個八進位制數:

使用二進位制到八進位制的轉換表將每組三位二進位制數轉換為一個八進位制數。
公式:
110
最高位中間位最低位
abc
210
octal =a * 2^2+b*2^1+c*2^0
題目:
110110
(110)(110)
110
1*2^2+1*2^1+0*2^0=6
1*2^2+1*2^1+0*2^0=6
合併:66
1011011
(001)(011)(011)
001
0*2^2+0*2^1+1*2^0=1
011
0*2^1+1*2^1+1*2^0=3
011
0*2^1+1*2^1+1*2^0=3
合併:133
100011
(000)(100)(011)
000
0
100
1*2^2+0+0=4
011
0*2^1+1*2^1+1*2^0=3
合併:43
11110010
(011)(110)(010)
011
0*2^1+1*2^1+1*2^0=3
110
1*2^2+1*2^1+0*2^0=6
010
0*2^2+1*2^1+0*2^0=2
合併:362
110010011
二進位制->十進位制
1101
同理
1*2^3+1*2^2+0*2^1+1*2^0=13
10101
1*2^4+0*2^3+1*2^2+0*2^1+1*2^0=21
100001
1×2^5 +0×2^4+0×2^3+0×2^2+0×2^1+1×2^0=32+0+0+0+0+1=33
111111
10011011
二進位制->十六進位制
步驟:
分組:從二進位制數的右端開始,每四位一組進行分組。如果最後一組不足四位,在左端補零。
轉換:將每組四位二進位制數轉換為相應的十六進位制數。
11011011
(1101)(1011)
1101
1*2^3+1*2^2+0*2^1+1*2^0=13->D
1011
1*2^3+0*2^2+1*2^1+1*2^0=11->B
十六進位制:DB
11110011
(1111)(0011)
1111
1*2^3+1*2^2+1*2^1+1*2^0=15->F
0011
0*2^3+0*2^2+1*2^1+1*2^0=3
合併:F3
110011001011
(1100)(1100)(1011)
1100
1*2^3+1*2^2+0+0=12->C
1100
1*2^3+1*2^2+0+0=12->C
1011
1*2^3+0*2^2+1*2^1+1*2^0=11->B
十六進位制:CCB
------------------
八進位制->二進位制
57
5
5/2=商2,餘數1
商(2)/2=商1,餘數0
商(1)/2=商0,餘數1
7
7/2=商(3),餘數1
商(3)/2=商(1)餘數1
商(1)/2商(0)餘數1
算出二進位制101111
777
7/2=商(3)餘數1
3/2=商(1)餘數1
1/2 商0,餘數1
算出二進位制111111111
12
1/2=商(0)餘數1 從上往下,位數不足補0,也就是001
2/2 商1,餘數0
1/2商0餘數1
所以就是001010

八進位制->十進位制
57
5*8^1+7*8^0=40+7=47
777
7*8^2+7*8^1+7*8^0=511
12
1*8^1+2*8^0=10
八進位制->十六進位制
57
二進位制為101111->(十六進位制)
(0010)(1111)
0+0+1*2^1+0=2
1*2^3+1*2^2+1*2^1+1*2^0=15->F
合併:2F
777

12
--------------------

十進位制->二進位制
45
45 ÷ 2 = 22 餘 1
22 ÷ 2 = 11 餘 0
11 ÷ 2 = 5 餘 1
5 ÷ 2 = 2 餘 1
2 ÷ 2 = 1 餘 0
1 ÷ 2 = 0 餘 1
從下往上
二進位制為:101101
100
100 ÷ 2 = 50 餘 0
50 ÷ 2 = 25 餘 0
25 ÷ 2 = 12 餘 1
12 ÷ 2 = 6 餘 0
6 ÷ 2 = 3 餘 0
3 ÷ 2 = 1 餘 1
1 ÷ 2 = 0 餘 1

二進位制為:1100100
十進位制->八進位制
除到商為0
45
45 ÷ 8 = 5 餘 5
5 ÷ 8 = 0 餘 5
八進位制為55
100
100 ÷ 8 = 12 餘 4
12 ÷ 8 = 1 餘 4
1 ÷ 8 = 0 餘 1
逆序排序:144
100

十進位制->十六進位制
45
45 ÷ 16 = 2 餘 13->D
2 ÷ 16 = 0 餘 2
逆序排序結果2D
100
100 ÷ 16 = 6 餘 4
6 ÷ 16 = 0 餘 6
逆序排序結果:64
--------------------
十六進位制->二進位制
1A3
1=0001
A=1010
3=0011
拼接:000110100011
十六進位制->八進位制
1A3
先轉換為二進位制
1=0001
A=1010
3=0011
000110100011
從右向做每三位一組
二進位制->八進位制
1A3
000=0
110=6
100=4
011=3
合併:0643
十六進位制->十進位制
1A3
1=1
A=10
3=3
1*16^2+10*16^1+3*16^0=419
---------------
什麼是原碼,補碼,反碼
----------
原碼是計算機表示整數的一種方式,其中數值的符號和大小分別用不同的位元位來表示。
正數:符號位為0,其餘位表示數值的絕對值。
負數:符號位為1,其餘位表示數值的絕對值。
對於8位系統:
+5 0000 0101
-5 1111 1010
反碼也是一種表示整數的方法,其中負數透過將其原碼的所有位取反得到。
正數的反碼與原碼相同
負數的反碼.符號位不變,剩餘的所有位全部取反
對於8位系統:
+5 0000 0101
-5 1111 1010
補碼計算機中有符號數的表示方法,正數的補碼和原碼相同,負數的補碼,將正數原碼取反,然後加1
對於8位系統:
補碼+5 0000 0101
補碼-5 1111 1010 +1 =1111 1011
--------------
Java進位制轉換
-----------
// 十進位制數
int decimalNumber = 26;

// 十進位制 -> 二進位制
String binaryString = Integer.toBinaryString(decimalNumber);
System.out.println("Decimal to Binary: " + binaryString);

// 十進位制 -> 八進位制
String octalString = Integer.toOctalString(decimalNumber);
System.out.println("Decimal to Octal: " + octalString);

// 十進位制 -> 十六進位制
String hexString = Integer.toHexString(decimalNumber);
System.out.println("Decimal to Hexadecimal: " + hexString);

// 二進位制 -> 十進位制
int decimalFromBinary = Integer.parseInt(binaryString, 2);
System.out.println("Binary to Decimal: " + decimalFromBinary);

// 八進位制 -> 十進位制
int decimalFromOctal = Integer.parseInt(octalString, 8);
System.out.println("Octal to Decimal: " + decimalFromOctal);

// 十六進位制 -> 十進位制
int decimalFromHex = Integer.parseInt(hexString, 16);
System.out.println("Hexadecimal to Decimal: " + decimalFromHex);

// 二進位制 -> 八進位制
String binaryToOctal = Integer.toOctalString(Integer.parseInt(binaryString, 2));
System.out.println("Binary to Octal: " + binaryToOctal);

// 二進位制 -> 十六進位制
String binaryToHex = Integer.toHexString(Integer.parseInt(binaryString, 2));
System.out.println("Binary to Hexadecimal: " + binaryToHex);

// 八進位制 -> 二進位制
String octalToBinary = Integer.toBinaryString(Integer.parseInt(octalString, 8));
System.out.println("Octal to Binary: " + octalToBinary);

// 八進位制 -> 十六進位制
String octalToHex = Integer.toHexString(Integer.parseInt(octalString, 8));
System.out.println("Octal to Hexadecimal: " + octalToHex);

// 十六進位制 -> 二進位制
String hexToBinary = Integer.toBinaryString(Integer.parseInt(hexString, 16));
System.out.println("Hexadecimal to Binary: " + hexToBinary);

// 十六進位制 -> 八進位制
String hexToOctal = Integer.toOctalString(Integer.parseInt(hexString, 16));
System.out.println("Hexadecimal to Octal: " + hexToOctal);
Java中位運算
-----------------
按位與 (&)
按位與運算子對兩個數的每一位執行邏輯與操作。只有當兩個運算元的對應位都為1時,結果位才為1(總結;相同返回1,不相同反0)。
0001
& 0011
--------
0001
public class Test6 {
public static void main(String[] args) {
int a = 1;
int b = 3;
System.out.println(a & b);輸出為:1
}
}


按位或 (|)
按位或運算子對兩個數的每一位執行邏輯或操作。只要其中一個運算元的對應位為1,結果位就為1(有1就反1,否則就反0)
int a1 = 1;
int b1 = 2;
/*
0001
0010
--------
0011
*/

System.out.println(a1 | b1);輸出3
按位異或 (^)
按位異或運算子對兩個數的每一位執行邏輯異或操作。如果兩個運算元的對應位不同,結果位就為1;如果相同,結果位為0(不同反1,相同反0)。
/*
0001
0011
------
0010
異或運算: 相同為0,不同為1
*/
System.out.println(1^3)輸出2;

按位取反 (~)
按位取反運算子對一個數的每一位執行邏輯取反操作,將0變為1,將1變為0。
//0000 0101
//1111 1011 取反是補碼中負數形式-6
int a = 5;
int result = ~a;
System.out.println(result); // 輸出-6
左移 (<<)
System.out.println(2 << 1); //每左移1位,乘以2 輸出4
右移 (>>)
System.out.println(4 >> 2); //每右移1位,除以2 右移2,除4輸出1

帶符號右移(>>)
將一個數的二進位制表示向右移動指定的位數。
對於正數,高位補0;對於負數,高位補1。
右移一位相當於除以2,右移n位相當於除以2的n次方。
用於保持數字的符號。
int x = -10; // 二進位制表示為 11111111 11111111 11111111 11110110
int y = x >>> 2; // 無符號右移兩位,結果應該是 00111111 11111111 11111111 11111101
System.out.println(y); // 輸出 1073741821

無符號右移(>>>)
將一個數的二進位制表示向右移動指定的位數,高位用0填充。
不考慮數字的符號,始終在最左邊填充0。
適用於處理無符號整數。
原始數: 0011 1100 1010
右移2位後,高位用0填充: 0000 1111 0010

相關文章