Java-进制转换

原码\反码\补码

正数

如:
[+1] = [00000001]原 = [00000001]反 = [00000001]补
可以看出:原码=反码=补码,正数的最高位为符号位,为0

负数

如:
[-1] = [10000001]原 = [11111110]反 = [11111111]补
可以看出:
负数的最高位为符号位,为1。
负数的反码=原码除符号位外取反。
负数的补码=反码加1。

负数的原码针对的是读程序的人,负数的补码针对的是计算机。

位运算

基本的位操作符有与、或、异或、取反、左移、右移6种,如下图:

符号 描述 运算规则
& 第一个操作数的第n位与第二个操作数的第n位若都为1,则结果n也为1,否则为0
| 第一个操作数的第n位与第二个操作数的第n位有且只有一个1,则结果n为1,否则为0
^ 异或 第一个操作数的第n位与第二个操作数的第n为相反,则结果为n位1,否则为0
~ 操作数的第n位为1,那么结果的第n位为0,反之。
<< 左移 二进制位全部向左移若干位,高位丢弃,低位补0
>> 右移 二进制位全部向右移若干位,对无符号数,高位补0,低位丢弃。

前提:计算机对于负数的计算使用的是其补码。

&

5 & 3
5:0000 0101
3:0000 0011
->0000 0001 = 1

5 & -4
5: 0000 0101
-4:1111 1100(原1000 0100 反1111 1011)
-> 0000 0100 = 4

-3 & -4
-3:1111 1101(原1000 0011 反1111 1100)
-4:1111 1100(原1000 0100 反1111 1011)
-> 1111 1100(反1111 1011 原1000 0100) = -4

^

5 ^ 3
5:0000 0101
3:0000 0011
->0000 0110 = 6

5 ^ -4
5: 0000 0101
-4:1111 1100(原1000 0100 反1111 1011)
-> 1111 1001(反1111 1000 原1000 0111) = -7

-3 ^ -4
-3:1111 1101(原1000 0011 反1111 1100)
-4:1111 1100(原1000 0100 反1111 1011)
-> 0000 0001 = 1

~

5:0000 0101
->1111 1010(反1111 1001 原1000 0110) = -6

-3:1111 1101(原1000 0011 反1111 1100)
-> 0000 0010 = 2

<<

5:0000 0101
<<3->0010 1000 = 40 (相当于5 * 2^3)
<<5->0000 0000 1010 0000 = 160 (相当于5 * 2^5)

-5:1111 1011(原1000 0101 反1111 1010)
<<3->1101 1000(反1101 0111 原1010 1000) = -40
<<5->0110 0000(反0101 1111 原1010 0000) = -160(符号位不变)
负数的左移为对应正数左移取负。

>>

前提:给定一个正整数p,任意一个整数n,一定存在等式:n = kp + r;k为n除以p的商。
120:0111 1000
>>3->0000 1111 = 15(120/2^3=15,即120 = 2^3 * 15,又比如:20>>3=2 20= 2^3*2 + 4)

负数的右移为对应正数右移取负。

进制转换

B(Binary)表示二进制,O(Octal)表示八进制,D(Decimal)表示十进制,H(Hexadecimal)表示十六进制。

二、八、十六进制->十进制

二进制->十进制

0011 1010 = 2^1 + 2^3 + 2^4 + 2^5 = 2 + 8 + 16 +32 = 58

八进制->十进制

765 = 5*8^0 + 6*8^1 + 7*8^2 = 5 + 48 +112 = 165

十六进制->十进制

2BC = 12*16^0 + 11*16^1 + 2*16^2 = 12 + 176 + 512 = 700

七进制->十进制

654 = 4*7^0 + 5*7^1 + 6*7^2 = 4 + 35 + 84 = 123

十三进制->十进制

9A8 = 8*13^0 + 10*13^1 + 9*13^2 = 8 + 130 + 1521 = 1659

十进制->二、八、十六进制

思想:辗转相除法

十进制->二进制(除2取余)

23-> 10111
23/2=11 + 1
11/2=5 + 1
5/2 =2 + 1
2/2 =1 + 0
1/2 =0 + 1

十进制->八进制(除8取余)

23-> 27
23/8=2 + 7
2/8 =0 + 2

十进制->十六进制(除16取余)

234-> DA
234/16= 14 + 10
14/16 = 0 + 14

十进制->七进制(除7取余)

23->32
23/7=3 + 2
3/7 =0 + 3

十进制->十三进制(除13取余)

234-> 150
234/13 = 18 + 0
18/13 = 1 + 5
1/13 = 0 + 1

二进制<->八、十六进制

二进制->八进制(三合一)

1011001-> 1,011,001 = 1,3,1 = 131

二进制->十六进制(四合一)

110 1101 1011-> 110,1101,1011=3,13,11=3DB

八进制->二进制(一分三)

456->4,5,6=100,101,110 = 100101110

十六进制->二进制(一分四)

ABC=10,11,12= 1010,1011,1100

八进制<->十六进制

八进制->十六进制(中间二进制)

765=7,6,5=111,110,101=1,1111,0101=1F5

十六进制->八进制(中间二进制)

ABC=10,11,12= 1010,1011,1100 =101,010,111,100=5274

2017年4月2日21:25:21补充

关于异或

任何整数n与0做异或运算,结果还为n。两个相等的整数n和m做异或运算,结果为0。

0%