很好的解释了x-1为什么以二进制形式“看起来”它的方式

如何解决很好的解释了x-1为什么以二进制形式“看起来”它的方式

让我们用二进制数字28

0b11100     # 28

如果我们从数字中减去1,则它看起来像这样:

0b11011     # 27

我将如何解释它的“外观”是从数字中减去1时,最右边的1位设置为零,而其后的所有零都设置为1。例如:

  0b10101 - 1
= 0b10100

  0b01000 - 1
= 0b00111

  0b10000000 - 1
= 0b01111111

关于为什么发生的最好解释是什么?我确定这是二进制二进制补码的属性,但我正在尝试找出向自己解释此问题的最佳方法,以便对它有更深入的了解。

解决方法

二进制数的一般形式为N = dn x b^n + dn-1 x b^n-1… d1 x b^1 + d0 x b^0,其中b是一个底数(2),d是一个数字

我们记下不带b的二进制数(因为我们知道它始终为2)并且不带n指数,n指数从0隐含最低有效数字(最右边),1到最右边的数字等等。

例如,您的数字28是 1 x 2 ^ 4 + 1 x 2 ^ 3 + 1 x 2 ^ 2 + 0 x 2 ^ 1 + 0 x 2 ^ 0 = 1x 16 + 1x 8 + 1x 4 + 0x 2 + 0x 1。

以二进制形式:

  • 1-1 = 0
  • 0-1 = 1,则将-1移至左侧的下一个位置(与十进制的10-1相同,0-1是9,然后将-1移至十分之一)

当从最右边的位置减去1时,将其从1移到1,然后将减法向上移动到下一个(左侧)位置(并且一直向下链接,直到找到可以减去而不会影响较高位置的位置)位置)

0b01000-1可以写为 0 x 2 ^ 4 + 1 x 2 ^ 3 + 0 x 2 ^ 2 + 0 x 2 ^ 1 + 0 x 2 ^ 0- 1 x 2 ^ 0。普通的十进制小数是8-1 = 7,二进制的7是 0 x 2 ^ 4 + 0 x 2 ^ 3 + 1 x 2 ^ 2 + 1 x 2 ^ 1 + 1 x 2 ^ 0(4 + 2 +1)

,

您的基础不重要,数学也不会改变:

  1000 
- 0001
========

这是10点,更容易看到:

  1  0  0  0 
- 0  0  0  1
=============

我们从一列开始(以0为底),最上面的数字小于最下面的数字,因此我们不得不借用,但是我们发现下一个列没有任何内容,依此类推,因此我们必须进行计算,直到我们可以借用某些东西为止,该值比它所在的列大一个基数,因此,如果您从数百列借入到10列的tens列中,那么:

所以先借:

  0 10  0  0 
- 0  0  0  1
=============

第二次借贷:

  0  9 10  0 
- 0  0  0  1
=============

第三次借贷:

  0  9  9 10 
- 0  0  0  1
=============

现在我们可以将基数加到一列:

  0  9  9 10 
- 0  0  0  1
=============
           9

在这种情况下,可以轻松完成它:

  0  9  9 10 
- 0  0  0  1
=============
  0  9  9  9

以5为底:

    1  0  0  0
 -  0  0  0  1
===================

    0  5  0  0
 -  0  0  0  1
===================

    0  4  5  0
 -  0  0  0  1
===================

    0  4  4  5
 -  0  0  0  1
===================


    0  4  4  5
 -  0  0  0  1
===================
    0  4  4  4

以2为基数:

   1  0  0  0
-  0  0  0  0 
==============

   0 10  0  0
-  0  0  0  0 
==============

   0  1 10  0
-  0  0  0  0 
==============

   0  1  1 10
-  0  0  0  0 
==============

   0  1  1 10
-  0  0  0  0 
==============
   0  1  1  1

在逻辑上实际实现二进制补码时,从基本编程类中我们知道,当我们谈论“二进制补码”时,我们学会了“取反加一”以取反数字。而且我们从小学数学知道x-y = x +(-y)因此:

     0
  1000
- 0001
=======

这与:

     1 <--- add one
  1000
+ 1110 <--- invert
=======

完成:

 10001
  1000
+ 1110
=======
  0111

因此,要进行减法运算,您需要对第二个操作数和进位进行求反/补码,并将其馈入加法器。一些体系结构将进位进行转换并称其为借用,而有些则保持不变。当我们以这种方式进行上述操作时,如果没有借入,则执行为1。如果有借贷,则为零。

我相信这仅是因为只有零或一而已,所以以2为底。您如何反转以10为底的数字? 1000-1 = 1000 + 9998 + 1,嗯,实际上有效。

所以10100-1 = 99,9100-1 = 88,8(八进制)100-1 = 77,7100-1 = 66,依此类推。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


依赖报错 idea导入项目后依赖报错,解决方案:https://blog.csdn.net/weixin_42420249/article/details/81191861 依赖版本报错:更换其他版本 无法下载依赖可参考:https://blog.csdn.net/weixin_42628809/a
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下 2021-12-03 13:33:33.927 ERROR 7228 [ main] o.s.b.d.LoggingFailureAnalysisReporter : *************************** APPL
错误1:gradle项目控制台输出为乱码 # 解决方案:https://blog.csdn.net/weixin_43501566/article/details/112482302 # 在gradle-wrapper.properties 添加以下内容 org.gradle.jvmargs=-Df
错误还原:在查询的过程中,传入的workType为0时,该条件不起作用 &lt;select id=&quot;xxx&quot;&gt; SELECT di.id, di.name, di.work_type, di.updated... &lt;where&gt; &lt;if test=&qu
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct redisServer’没有名为‘server_cpulist’的成员 redisSetCpuAffinity(server.server_cpulist); ^ server.c: 在函数‘hasActiveC
解决方案1 1、改项目中.idea/workspace.xml配置文件,增加dynamic.classpath参数 2、搜索PropertiesComponent,添加如下 &lt;property name=&quot;dynamic.classpath&quot; value=&quot;tru
删除根组件app.vue中的默认代码后报错:Module Error (from ./node_modules/eslint-loader/index.js): 解决方案:关闭ESlint代码检测,在项目根目录创建vue.config.js,在文件中添加 module.exports = { lin
查看spark默认的python版本 [root@master day27]# pyspark /home/software/spark-2.3.4-bin-hadoop2.7/conf/spark-env.sh: line 2: /usr/local/hadoop/bin/hadoop: No s
使用本地python环境可以成功执行 import pandas as pd import matplotlib.pyplot as plt # 设置字体 plt.rcParams[&#39;font.sans-serif&#39;] = [&#39;SimHei&#39;] # 能正确显示负号 p
错误1:Request method ‘DELETE‘ not supported 错误还原:controller层有一个接口,访问该接口时报错:Request method ‘DELETE‘ not supported 错误原因:没有接收到前端传入的参数,修改为如下 参考 错误2:cannot r
错误1:启动docker镜像时报错:Error response from daemon: driver failed programming external connectivity on endpoint quirky_allen 解决方法:重启docker -&gt; systemctl r
错误1:private field ‘xxx‘ is never assigned 按Altʾnter快捷键,选择第2项 参考:https://blog.csdn.net/shi_hong_fei_hei/article/details/88814070 错误2:启动时报错,不能找到主启动类 #
报错如下,通过源不能下载,最后警告pip需升级版本 Requirement already satisfied: pip in c:\users\ychen\appdata\local\programs\python\python310\lib\site-packages (22.0.4) Coll
错误1:maven打包报错 错误还原:使用maven打包项目时报错如下 [ERROR] Failed to execute goal org.apache.maven.plugins:maven-resources-plugin:3.2.0:resources (default-resources)
错误1:服务调用时报错 服务消费者模块assess通过openFeign调用服务提供者模块hires 如下为服务提供者模块hires的控制层接口 @RestController @RequestMapping(&quot;/hires&quot;) public class FeignControl
错误1:运行项目后报如下错误 解决方案 报错2:Failed to execute goal org.apache.maven.plugins:maven-compiler-plugin:3.8.1:compile (default-compile) on project sb 解决方案:在pom.
参考 错误原因 过滤器或拦截器在生效时,redisTemplate还没有注入 解决方案:在注入容器时就生效 @Component //项目运行时就注入Spring容器 public class RedisBean { @Resource private RedisTemplate&lt;String
使用vite构建项目报错 C:\Users\ychen\work&gt;npm init @vitejs/app @vitejs/create-app is deprecated, use npm init vite instead C:\Users\ychen\AppData\Local\npm-