首页 > 解决方案 > 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 才能找到二进制补码。代码似乎没有在任何地方这样做。那么它是如何工作的呢?

请澄清,提前谢谢。

标签: cfor-looptwos-complement

解决方案


首先,我不完全理解空 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

程序的逻辑正是我所说的。


推荐阅读