【Java】程序员的基本功—进制

本文详细介绍了二进制、八进制、十进制和十六进制之间的转换规则,包括如何从一种进制转换到另一种。同时,讲解了原码、反码和补码的概念及其在计算机中的作用。此外,还探讨了位运算符,如按位与、按位或、按位异或、按位取反、算术左右移和逻辑右移,并通过代码示例解释了它们的运算过程。
摘要由CSDN通过智能技术生成

目录

前言

一、进制的基本介绍

二、进制之间的转换

1、二、八、十六进制转十进制

1)二进制转十进制

2)八进制转十进制

3)十六进制转十进制

2、十进制转换成二、八、十六进制

1)十进制转二进制

2)十进制转八进制

3)十进制转十六进制

3、二进制转八、十六进制

1)二进制转八进制

2)二进制转十六进制

4、八、十六进制转二进制

1)八进制转二进制

2)十六进制转二进制

三、原码、反码与补码

四、位运算符

1、位运算符一览

2、代码举例

1)&、|、^、~

2)<<、>>、>>>


前言

进制对我们今后理解更复杂的知识有着重要作用。对于整数来说有四种表示方式:二进制、十进制、八进制、十六进制。而我们的计算机是以二进制的方式进行存储的。接下来我们深入地学习一下进制的知识。


一、进制的基本介绍

正如,前言所说整数的进制有四种:

二进制:0、1          满2进1,以0b或0B开头

十进制:0-9            满10进1

八进制:0-7            满8进1,以数字0开头

十六进制:0-9及A(10)-F(15)      满16进1,以0x或0X开头表示。此处的A-F不区分大小写

代码举例:

public class CSDN { 
	//编写一个main方法
	public static void main(String[] args) {

		//n1 二进制
		int n1 = 0b1010;
		//n2 十进制
		int n2 = 1024;
		//n3 八进制
		int n3 = 01024;
		//n4 十六进制
		int n4 = 0X1024;

		System.out.println("n1 = " + n1);
		System.out.println("n2 = " + n2);
		System.out.println("n3 = " + n3);
		System.out.println("n4 = " + n4);
	}
}

进制的图示:

十进制十六进制八进制二进制
0000
1111
22210
33311
444100
555101
666110
777111
88101000
99111001
10A121010
11B131011
12C141100
13D151101
14E161110
15F171111
16102010000
17112110001

二、进制之间的转换

1、二、八、十六进制转十进制

1)二进制转十进制

规则:

从最低位(右边)开始,将每个位上的数提取出来,乘以2的(位数-1)次方,然后求和

例子:将 0b1011 转成十进制的数

0b1011 = 1 * 2^(1-1)1 *  2^(2-1) + 0 * 2^(3-1) + 1 * 2^(4-1) = 1 + 2 + 0 + 8 = 11

2)八进制转十进制

规则:

从最低位(右边)开始,将每个位上的数提取出来,乘以8的(位数-1)次方,然后求和

例子:将 0234 转成十进制的数

0234 = 4 * 8^(1-1) + 3 * 8^(2-1) + 2 * 8^(3-1) = 4 + 24 + 128 = 156

3)十六进制转十进制

规则:

从最低位(右边)开始, 将每个位上的数提取出来, 乘以 16 的(位数-1)次方, 然后求和

例子:

请将 0x23A 转成十进制的数

0x23A = 10 * 16^0 + 3 * 16 ^ 1 + 2 * 16^2 = 10 + 48 + 512 = 570


2、十进制转换成二、八、十六进制

1)十进制转二进制

规则:
将该数不断除以2,直到商为0为止,然后将每步得到的余数倒过来,就是对应的二进制

例子:

请将 34 转成二进制

 

2)十进制转八进制

规则:

将该数不断除以8,直到商为0为止,然后将每步得到的余数倒过来,就是对应的八进制

例子:

请将 131 转成八进制

3)十进制转十六进制

规则:

将该数不断除以16, 直到商为 0 为止, 然后将每步得到的余数倒过来, 就是对应的十六进制。

例子:

请将 237 转成十六进制


3、二进制转八、十六进制

1)二进制转八进制

规则:

从低位开始,将二进制数每三位一组, 转成对应的八进制数即可

例子:

请将 0b11010101 转成八进制

0b11010101  =>  0b11(3)010(2)101(5)  =>  0325

那为什么是每三位一组呢?这是因为二进制111是7,可以很好地表示0-7即一位八进制的范围

2)二进制转十六进制

规则:

从低位开始, 将二进制数每四位一组, 转成对应的十六进制数即可

例子:

请将 0b11010101 转成十六进制

0b11010101  =>  0b11010101  =>  0b1101(D)0101(5)  =>  0xD5

为什么是四位一组?四位1111最大数为15,可以很好的表示0-F即一位的十六进制的范围。


4、八、十六进制转二进制

1)八进制转二进制

规则:

将八进制数每 1 位, 转成对应的一个 3 位的二进制数即可

八进制转二进制、二进制转八进制可以看成逆过程,即把八进制的每一位转成一个对应的三位的二进制即可。

例题:

请将 0237 转换成二进制

0237  =>  02(010)3(011)7(111)  =>  0b10011111

2)十六进制转二进制

规则:

将十六进制数每 1 位, 转成对应的 4 位的一个二进制数即可

十六进制转二进制、二进制转十六进制可以看成逆过程,即把十六进制的每一位转成一个对应的三位的二进制即可。

例题:

请将 0x23B 转成二进制

0x23B  =>  0x2(0010)3(0011)B(1011)  =>  0b001000111011


三、原码、反码与补码

现代的电子计算机技术全部采用的是二进制因为它只使用0、1两个数字符号,非常简单方便,易于用电子方式实现。计算机内部处理的信息,都是采用二进制数来表示的。而二进制又分为原码、反码和补码三种,真正存储在计算机内的是二进制的补码形式。我们一起来学习二进制的原码、反码以及补码,这为后面我们进行位运算符的学习打下基础。

对于有符号的而言,又一下规则需要我们记住的:

  1. 二进制的最高位是符号位:0表示正数,1表示负数
  2. 正数的原码、反码、补码都相同(三码合一)
  3. 负数的反码 = 它的原码符号位不变,其他位取反(即0—>1,1—>0)
  4. 负数的补码 = 它的反码 + 1,负数的反码 = 负数的补码 - 1
  5. 0的反码、补码都是0
  6. Java没有无符号数,即:Java中的数都是有符号的
  7. 在计算机运行时,都是以补码的方式来运算的
  8. 当我们看运算结果的时候,是看它的原码

根据上面的规则我们来举一个负数(正数的原码、反码、补码都相同)的例子—写出-3的原码、反码、补码:

  • 原码:10000000 00000000 00000000 00000011
  • 反码:11111111 11111111 11111111 11111100
  • 补码:11111111 11111111 11111111 11111101

四、位运算符

1、位运算符一览

位运算符
按位与:&

两位全为1,结果为1,否则为0

按位或:|两位有一个为1,结果为1,否则为0
按位异或:^两位相同即为0,不相同即为1
按位取反:~0—>1,1—>0
算术右移:>>低位溢出,符号位不变,并用符号位补溢出的高位
算术左移:<<符号位不变,低位补 0
逻辑右移(无符号右移):>>>低位溢出, 高位补 0

特别说明:没有  <<<  符号

2、代码举例

1)&、|、^、~

①:计算  -3 & 4

我们前面说到过进行位运算是二进制的补码进行计算,即我们先得出-3和4的补码:

11111111 11111111 11111111 11111100 — -3的补码

00000000 00000000 00000000 00000100 — 4的补码

根据&规则得:

00000000 00000000 00000000 000000100 — -3&4 = 4

^、|、~的计算与&步骤一致,都是先将两个数的补码先得出来,得出来之后根据不同的位运算符的规则得出结果的补码,若该数为正数即该二进制码为原码,若该数为负数则需要进行转换成原码,得到最后的结果。

②:计算 6 | 3

00000000 00000000 00000000 00000110 — 6的补码

00000000 00000000 00000000 00000011 — 3的补码

根据 | 规则得:

00000000 00000000 00000000 00000111 — 6|3 = 7 

③:计算 4 ^ 8

00000000 00000000 00000000 00000100 — 4的补码

00000000 00000000 00000000 00001000 — 8的补码

根据 ^ 规则得:

00000000 00000000 00000000 00001100 — 4 ^ 8 = 12

④:计算 ~5

00000000 00000000 00000000 00000101 — 5的补码

根据 ~ 规则得:

11111111 11111111 11111111 11111010 — ~5后的补码

11111111 11111111 11111111 11111001 — ~5后的反码

10000000 00000000 00000000 00000110 — ~5后的原码 — 即最后结果 = -6

2)<<、>>、>>>

①:计算 -1 >> 2

11111111 11111111 11111111 11111111 — -1的补码

低位溢出,符号位不变,并用符号位(此符号位为1)补溢出的高位:

11111111 11111111 11111111 11111111 — -1 >> 2 = -1

②:计算 6 << 3

00000000 00000000 00000000 00000110 — 6的补码

符号位不变,低位补 0

00000000 00000000 00000000 00110000 — 6 << 3 = 48

③:计算 2 >>> 3

00000000 00000000 00000000 00000010 — 2的补码

低位溢出, 高位补 0

00000000 00000000 00000000 00000000 — 2 >>> 3 = 0


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值