c - C 程序寻找两个人的赞美
问题描述
我在一本书中遇到了一个 C 代码来查找二进制数的二进制补码。我不熟悉二进制数的一个和两个补码的概念,所以我做了一个彻底的研究,现在理解了一点。但是我仍然对代码的工作方式有一些疑问。代码如下(原始代码中没有注释,是我添加的,如果有错我可以更正)-
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
void main()
{
char a[16]; /*declaring an array to hold the binary number string*/
int i, j, k, len; /*len is the length of the string*/
printf ("Enter a binary number: ");
gets (a); /*reads the input string*/
len= strlen(a); /*calculates length of string*/
for (k=0; a[k]!='\0';k++) /*to check if its a valid binary number or not*/
{
if (a[k] != '0' && a[k]!='1')
{
printf ("\nIncorrect Binary format...this program will quit");
exit(0);
}
}
for (i=len-1; a[i]!='1'; i--) /* An empty for loop*/
;
for (j=i-1; j>=0; j--) /*checks from right to left if the bit is 0 or 1*/
{
if (a[j]=='1')
a[j]= '0'; /*if the bit is 1, its converted to 0*/
else
a[j]= '1'; /*if the bit is 0, its converted to 1*/
}
printf ("\n2's compliment = %s", a);
}
代码工作得很好,但我怀疑如何。
首先,我不完全理解空 for 循环的作用。直到我们遇到右侧的第一个零才算数?
其次,在第三个也是最后一个 for 循环中,我们只是将每个位的值从 1 翻转到 0 和从 0 翻转到 1。但是我们这样做是为了一个补码,而不是二进制补码,对吧?我们需要在一个补码上加 1 才能找到二进制补码。代码似乎没有在任何地方这样做。那么它是如何工作的呢?
请澄清,提前谢谢。
解决方案
首先,我不完全理解空 for 循环的作用。
它是找到最右边的1
并将其分配给i
。
其次,在第三个也是最后一个 for 循环中,我们只是将每个位的值从 1 翻转到 0,从 0 翻转到 1。
它是翻转所有从 index 开始的位i-1
。
我在微处理器课程中学到了这个技巧。它是从右到左开始读取位,直到看到第一个位1
。不要翻转它。之后,翻转所有位。
咱们试试吧,10110 -> 01010
- 从右边开始。
- 阅读
0
,这不是 1. 继续, - 阅读
1
,是的,我们得到第一个位,即1
. 不要翻转它。 - 阅读
1
,翻转它。现在是0
。 - 阅读
0
,翻转它。现在是1
。 - 阅读
1
,翻转它。现在是0
。
我们得到01010
程序的逻辑正是我所说的。
推荐阅读
- c++ - 使用 Visual Studios 16.6 添加包含目录
- python - 来自元组列表的 Python 热图
- ios - Swift - 如何发出 cURL 请求?(Swift 5.2 / macOS Catalina)
- sql - 显示 TOP 1 考虑 where 条件(如果存在)-SQL 查询
- docker - 在多主机 Docker 上创建 Hazelcast 集群的简单方法
- python-3.x - 寻找一种在 Windows 上使用 Python “锁定”和“解锁”文件夹的简单方法
- java - 为什么要在 Apache Kafka 中序列化/反序列化密钥和记录?
- c# - C# 中的 System.ArgumentOutOfRangeException 错误
- node.js - 我想要一个用于每 1 分钟在语音频道中就座的硬币系统
- mysql - 在索引列上计算行数比在主列和普通列上慢?