关于Java中进制转换以及位运算问题

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

posted @   GOZO  阅读(15)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示