进制数相关

本着回顾一下学习过的知识,写下这篇文章,希望将来有用得到的时候,当然有错误的地方希望大神留下评论指导一下,在下感谢不已!

我们通常使用的数字都是十进制数,然而计算机中的数据计算和存储都是以二进制形式进行的,并且计算机只能计算加法,存储的数据都是以补码的形式存储的。

一.十进制转二进制步骤:
1.将数字对2取余,将商再对2取余,一直循环,直到商为0为止;
2.将每次得到的余数逆序排列即可得到对应的二进制数。
例如:为了方便,我们将对short型(2个字节,16位)数字11转换为二进制数,如图所示:
这里写图片描述
所得到的二进数为1011,但这还不是全部,这只有4位,short型数据时2个字节16位,所以补全后我们得到的完整二进制数为0000 0000 0000 1011。

二.二进制转十进制步骤:
1.将二进制数从右往左,依次以当前位上的数字w乘以2的n-1次方(w*2^n-1),这里的n为当前的第几位,然后将所得的数字相加即可。
如上图所示:求得11的二进制数为0000 0000 0000 1001,我们从右往左依次是1*2^0,1*2^1,0*2^2,1*2^3,0*2^······,数学基础知道0乘以任何自然数得到的都为0,所以其实位上数字是0的可以不用计算,最后我们得到:1+2+0+8 = 11。

三.十进制、八进制、十六进制相互转换
1.前面加0的数组被解析为八进制数,例如:0123,这里最左边的0只是解析符号而已。
将八进制数0123转换为十进制与二进制转十进制一样,都是从右往左开始,以当前位上的数字w乘以8的n-1次方(w*8^n-1),这里的n为当前的第几位,然后将所得的数字相加即可。
3*8^0+2*8^1+1*8^2 = 83,即八进制数123转换为十进制为83;

十进制转八进制也和十进制转二进制一样,只是取余的对象为8而已:
这里写图片描述

2.发现它们的转换方法类似后,其实不难发现十六进制与十进制之间的转换方式也是一样,就是十进制数自己本身也是按照同样的规则转换的,在这里就不一一举例说明了。
前面加0x的数字被解析为十六进制数,0x就是解析符号。

四.二进制数之间的符号运算:
在计算之前我们先要了解几个概念:
1.二进制数的最高位,即最左边的那一位数字(符号位)表示符号,0代表正数,1代表负数,例如:short型的11的二进制数为0000 0000 0000 1011,short型的-11的二进制数为1000 0000 0000 1011,在这里我们不难发现11和-11的二进制数除了最高位不同,其余的全部相同,也即类型相同、绝对值相同的数字它们的二进制数除了最高位不同外其余全部一样。

2.正数的原码,反码,补码都是相同的:
原码:我们之前所说的一个数的二进制数其实说的就是原码,例如11和-11的二进制数。

反码:其实这个操作是对于负数的原码而言的,因为正数的原码、反码、补码皆为相同,通过之前的我们知道,负数的原码其符号位为1,代表负数,求其反码就是保持符号位的1不变,其余的全部取反,例如short型-11的原码为1000 0000 0000 1011,其反码就是:1111 1111 1111 0100;

补码:在求得的反码基础上,保持符号位置的1不变,在数值部分最后面(最右边)加1,以得2进1剩0的原则计算。例如short型-11的反码为1111 1111 1111 0100,其补码就为1111 1111 1111 0101,可惜这一次没有得到2的情况。如果一个数的反码为1111 1111 1111 0101,那么其补码就为:1111 1111 1111 0110。

知道上面那些有什么用呢?我们知道计算机存储的数据都是以补码的形式存在的,有些计算方式也是按照自算计中存储的补码进行的,然而我们知道的一般都是原码,所以求补码就有必要啦!
总结:负数求补码:负数的原码—>求反码—>求补码

下面举个例子:
已知short a=92,求~a是多少?(~运算符是按位取反的意思,按位取反是按照存储在计算机中的补码来算的,算完后反过来转换成原码就能得到~a的数值,反过来的顺序就是将负数求补码的顺序倒过来,补码—>求反码—>求原码)
short:92—>原码:0000 0000 0101 1100,由于正数的原码反码补码都相同,那么只需要对0000 0000 0101 1100全部取反即可得到所要求得值的补码1111 1111 1010 0011,然后反补码-1得到反码1111 1111 1010 0010,最后反反码得到原码10000 0000 0101 1101,转换成十进制后便是-93,即~a=-93;
那么反过来,已知a=-93,求~a?
首先求-93的补码:先得原码10000 0000 0101 1101,然后得反码1111 1111 1010 0010,再得补码:1111 1111 1010 0011,最后对补码全部取反得到要求的补码0000 0000 0101 1100,由于正数的原码反码补码都相同,所以转变成十进制得到的数字即为所求,为92;
总结:1.正数按位取反得到的数为负数,其绝对值为原本数值的绝对值+1,如92按位取反得-93;
2.负数按位取反得到的数位正数,其绝对值为原本的绝对值减1,如-93按位取反得92;

五.由计算机上存储的补码得到原码:
其实这个过程在上面已经说过了,但我们要注意一个问题:反补码对二进制数减1的时候,不够减的情况向更高为的借1,被借掉的位变成0,后面的都会得到填充为1,例如:
byte型(1个字节8位)数值存储在计算机中的补码为1111 0100,我们反过来求其数值。
反补码得到反码:1111 0011(这时候我们就是借了高位一个1,这个高位后面的低位全部填充为1)
反反码得到原码:1000 1100 (保留符号位1不变)
求得十进制数为-12,我们反过来计算补码发现确实能够还原。

注意:取反和按位取反的不同,无论是反码还是反反码都是要保留符号位的1不变(针对负数的情况,正数的原码、反码,补码相同,不会做取反操作),按位取反是全部取反包括符号位。

六.数值之间的其他按位运算
下面的操作可直接按照原码来计算:
&:且与操作,仅在对应的位上数值都为1时得1;
^:异或操作,仅在对应的位上数值不相同时得1;
|:或操作,对应的位置上有一个为1,或者都为1,那么就得1;
例如如图所示:
这里写图片描述
将图片中得到的原码转换成对应的数字即可得到相应的值。
byte a=10,b=-9;
a&b=8;
a^b=-3;
a|b=-11;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值