反码与补码 位移符 -- 计算机底层艺术 一篇让你理解透这些概念

Java位移符 反码 补码

前言

你好,你是否曾经拥有过一个疑问?

当你打开电脑,绚丽的图片,轻柔的音乐、妙趣的视频簇拥着你时,
你是否思考过,这五彩斑驳的计算机世界到底是由何组成?


答案是 0和1。此刻你所看到的一切底层都是0和1组成,即二进制表示。
在这里插入图片描述

那么今天我将为大家介绍的是数字在计算机中的表示。

计算机补码

计算机的底层是由二进制实现的,如需要存储数字。首先要分配固定空间,然后以补码形式存储。

计算机补码分为符合位与绝对值位。
在这里插入图片描述
符号位:所分配空间最高位。如一个字节的空间,最高位即为从右到左第八位。

绝对值位:当前空间中除开符号位剩下的位置。

一、原码、反码、补码

  • 原码:计算机表达数字代码(我们所理解的二进制码),如一个八位的空间,0000 0101,十进制的5
  • 反码:正数的反码与补码都是它本身,而负数的反码是除去符号位其他位方取反,如 10001001的反码为:1111 0110
  • 补码:正数的反码与补码都是它本身,负数的补码为反码加一,即 1000 1001的补码为 1111 0111

计算机存储数字时,需要经过以上运算,以补码形式进行存储。

二、取出并显示

这是关键,当一个计算机源码被提取并要求显示在屏幕上(即变为我们所理解的十进制)。首先会进行符号位的判断:

  • 当符号位为正(0)按照我们常见的流程,二进制转换为十进制;
  • 当这个符号位为负(1)时,先-1(变为反码),再取反(变为原码)。再保留符号位,将其转换为十进制

-1 补码为 1111 1111 减一 为 1111 1110 取反后为 1000 0001 转换为十进制为 -1

三、java 位移符

位移符用于控制在计算机内部源码(二进制)的移动,而位移符又分为三种:

下面演示内容,分配空间均为1字节(8位),即:1位符号位+7位绝对值。

1. >> 带符号位移

向右移动,最高位补充当前符号位(1或0)

例如 4 >> 2 4的补码为0000 0100 带符号右移两位 0000 0001

System.out.println(4 >> 2);// 1

2. << 带符号左移

向右移动,最低位补0。

例如 4 << 2 4的补码为0000 0100 带符号右移两位 0001 0000

 System.out.println(4 << 2); // 16

3. >>> 带符号右移

向右移动,最高位补0
如 -1 >> 1 为多少? 0 ?错,仔细看看下面。

我们知道数字在计算机里是以补码的形式存储的,所以 -1 在计算机中的源码为:1111 1111
当它右移,最高位补0,则为 0111 1111,则为 -127。

System.out.println(-1 >>> 1);// 2147483647

那为什么上面代码输出这么大的数勒? 因为Java中默认整形(int)存储空间为32位。

即-1 的补码 为 1111 1111 1111 1111 1111 1111 1111 1111

大家可以尝试用我刚才的方法,推出为什么执行后的数字辣么大!

规律:当一个数字当它为奇数时,二进制的最低为一定为1。

7 的计算机源码(假设空间为一字节)为:0000 0111

总结

以上就是我今天的内容,本来是打算写两个章节,但是为了阅读方便。我就将补码和反码的概念加了进来。如果你仔细阅读,相信你一定可以将位移法理解透,并对计算机底层有一些了解。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值