C程序找到两个恭维

时间:2018-05-19 10:43:25

标签: c for-loop twos-complement

我在书中遇到了一个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循环中,我们只是将每个位的值从1翻转到0并从0翻转到1.但是我们这样做是为了补充,而不是两个&#39;补充,对吗?我们需要在1的补码中加1来找到2的补码。代码似乎在任何地方都是这样做的。它是如何运作的?

请事先明确表示清楚。

2 个答案:

答案 0 :(得分:1)

  

首先,我并不完全明白空循环的作用。

找到最右边的1并将其分配给i

  

其次,在第三个和最后一个for循环中,我们只是翻转每个的值   位从1到0,从0到1。

将所有位翻转为索引i-1

我在微处理器课程中学到了这个技巧。从右到左开始读取位,直到看到第一位为1。不要翻转它。之后,翻转所有位。

让我们试试10110 -> 01010

  • 从右起。
  • 阅读0,不是1.继续,
  • 阅读1,是的,我们得到的第一位是1。不要翻转它。
  • 阅读1,翻转它。现在是0
  • 阅读0,翻转它。现在是1
  • 阅读1,翻转它。现在是0

我们得到01010

程序的逻辑就是我提到的。

答案 1 :(得分:0)

通常,为了计算两个补码,我们将所有的1改为0,将所有的0改为1,然后加1。

让我们看一下172或二进制10101100的两个补码:

10101100
01010011      /* change all 0's to 1's and 1's to 0's */
01010100      /* add one */

请注意,当我们添加1时,我们将1中的一些更改回0。实际上,原始数字右边缘的0都保持为0.并且原始数字中最右边的1保持为1.而左边只有1和0?实际上被交换的最右边1个。

这就是原始程序中神秘循环的作用。它从右侧扫描,跳过0,直到找到第一个1,并且它只是该点左边的数字实际交换。变量i最终保持最右边1的位置,然后下一个循环(实际进行交换的循环)从j = i - 1开始。

还有一件事:抱歉唠叨这一点,你可能已经知道了,但你真的不应该使用gets()功能,即使是在一个小测试程序中也是如此。这是一个真正可怕的危险功能。