2021-08-02-进制学习笔记

进制

1.进制介绍

进制是指进位制,是人们规定的一种进位方式,表示某一位置上的数,运算时是逢X进一位

十进制逢十进一就、借一当十,二进制逢2进一、借一当二·········

  • 注意事项:

a.十进制 Java中,数值默认都是十进制,不需要任何修饰

b.二进制 数值前面以0b开头,b大小写都可以

c.八进制 数值前面以0开头

d.十六进制 数值前面都以0x开头,x大小写都可以

2.进制转换
2.1 其他进制转换为十进制
2.1.1 公式

系数*基数的权次幂,然后相加

系数------每一位上的数

基数------几进制就是几

权---------从数值的右侧,以零开始,逐个+1增加

2.1.2 示例

例:0b100

分析:1.0b开头说明数据时二进制,所以基数为2

​ 2.系数为每一位上的数,所以系数分别为1、0、0

​ 3.权从右以零开始,逐个加一,所以从左到右分别为2、1、0

解: 0×20+0×21+1×2^2=4

2.2 十进制转化为任意其他进制
2.2.1 公式

除基取余:使用需要转换为其他进制的十进制数据,不断地除以基数(像转化为几进制数据基数就是几),得到余数,指导商为零为止,然后将余数倒着排序即为相应的进制数。

2.2.2 示例

例:将十进制数字11,转化为2进制数据

分析:需要转换的数据为11,基数为2,需要用11一直除以2,直到商为零
在这里插入图片描述

结果为:1011

2.3 快速进制转换法
2.3.1 8421码

8421码又称BCD码,是BCD(Binary-Coded Decimal,指二进制码十进制数)代码中最常用的一种,在这种编码方式中,每一位二进制值的1都是代表一个固定数值,把每一位的1代表的十进制数加起来的得到的结果就是它所代表的十进制数。

2.3.2 二进制快转十进制

在这里插入图片描述

例如:0b1101

对应的码为:8、4、2、1

将一所对应的值取出来并相加,零对应的数值忽略,得到的结果就为其对应的十进制数值

2.3.3 二进制块转八进制

与二进制快转十进制规则不同,二进制快转八进制需要将三个二进制位看为一组,再进行转换。原因是八进制逢八进一,三个二进制位最多表示111,也即是十进制数值7,如果出现第四位就超范围了。

在这里插入图片描述

将数据111100转化为八进制数值,三个一组,将各自组内的结果相加,再拼到一起即为八进制数据74

2.3.4 二进制快转十六进制

将四个2禁止数据看为一组,再用8421码转换,原因是四个二进制码字多可以表示1111,也即是十进制数值15,如果出现第五位就超过十六进制的表达范围了。

示例:将60的二进制0b111100转化为十六进制
在这里插入图片描述

将3和C拼在一起即为十六进制数值0X3C了。

3.原码和补码
3.1 原码和补码的介绍

计算中的数据都是以二进制补码的形式在运算,而补码是通过反码和原码推算出来的

3.1.1 原码

可直观看出数据大小,又称二进制定点表示法,即最高位为符号位,0表示正,1表示负,其余位数表示数值大小,如+7的原码为:00000111,-7的原码为:10000111。

3.1.2 反码

整数的反码与原码相同,负数的反码时对其原码逐位取反,但符号位保持不变,如-7的反码位:

11111000

3.1.3 补码

正数的补码与其原码相同,负数的补码是在反码的末位加1,如-7的反码为:11111001

3.2 用二进制码解释数值运算原理
byte b = (byte) 130;
System.out.println(b);//输出的结果为-126

分析:130为整数,默认为int型,int型数据占4个字节,所以130用2进制表示为:

00000000 00000000 00000000 100000010

当数据为正数时,原码就是反码,原码就是补码,所以强转时130不需要再进行转化了。强转是直接将超过范围的数据直接删去,byte的字节数为1,所以强转之后的二进制数值为:

10000010

此时补码的最高位为1,数值变为了负数,负数的补码转化为原码需要在末尾-1,将补码转化为反码的二进制值为:

10000001

负数将反码转化为原码是逐位取反,符号位除外,所以二进制原码为:

11111110

将数值转化为十进制数为

-(2+4+8+16+32+64)=-126

4.位运算符

4.1 概述
  • 位运算符是指二进制位的运算,先将十进制转化为二进制后再进行运算
  • 在二进制位运算中,1表示真(true),2表示假(false)
4.2 基本运算符

4.2.1 各位运算符效果介绍

  1. &,位与:数据转换为2进制之后逐位运算,两位上的数据都为真时,结果为真,得到结果1,有一位或者两位都为假则结果为假,得到数据0
  2. |,位或:数据转换为2进制后逐位运算,有一位为真时结果就为真,得到结果1,两位同时为假时才为假,得到结果0
  3. ^,位异或:两位上的数据相同时位假,得到结果0,不同时结果为真,得到结果1;

一个数被另一个数异或两次该数本身不变

  1. ~,取反:二进制的数据全部取反,包括符号位,0变1,1变0

4.2.2 示例

System.out.println(6&2);
/*
6的二进制数值:00000000 00000000 00000000 00000110
2的二进制数值:00000000 00000000 00000000 00000010
对6和2进行与运算:从右数第一位,都为0,结果为0,第二位都为1,结果为1,第三位2的第三位为0,所以结果为0,第三位以后位上都为零,所以结果都为零,得到最终结果为:
             00000000 00000000 00000000 00000010
             即输出值为:2
*/
System.out.printlb(~6);
/*
6的二进制数值:00000000 00000000 00000000 00000110
对二进制数运算前要转化为补码形式,正数的补码和原码一致,故不要转化可以直接运算
对6的二进制数取反得到:
             11111111 11111111 11111111 11111001
此处得到的结果为补码形式,需要转化为反码,再转化为原码
转化为反码得到的结果为(原码转化为反码,末尾+1,反码转化为原码末尾-1):
             11111111 11111111 11111111 11111000
转化为原码得到:
             00000000 00000000 00000000 00000111
             即最终输出结果为:-7
*/
4.3 位移运算符

4.3.1 概述

将二进制数据向左或向右移动,向左移相当于是做乘法,向右移动相当于做除法,由于是对二进制数直接进行运算,速度较正常运算要快

4.3.2 位移运算符介绍

  1. 有符号左移运算<<,例:12<<2

00000000 00000000 00000000 00001100

左边的数据删除两个,最右边补两个0

向左移后:

00000000 00000000 00000000 00110000

  1. 有符号右移运算>>,例:12>>2

右边的数据删掉两个,左边的数据加上两个符号位数据,为0则加两个0,为1则加两个1

00000000 00000000 00000000 00000011

  1. 无符号右移运算符>>>,无论符号位是零还是1都补0,也就是负数经过位移运算后会变成正数,正数不会改变符号
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值