繁体   English   中英

While循环会比预期更多或更少地迭代

[英]While loop iterates itself more or less than it should

奥斯汀·黑斯廷斯(Austin Hastings)和迈克尔·伯尔(Michael Burr)的Anwers解决了我的问题,就像我刚刚意识到的那样,这个循环一直都是正确的,并且它是何时解决的,就像奥斯汀·黑斯廷斯(Austin Hastings)一样。 由于是评论,因此无法标记为答案。 谢谢你的帮助!

我在C中分配了一个任务,即仅打印128和255之间的特定种类的数字(即8位二进制表示形式),并且我应该在不使用任何算术运算符的情况下执行此操作。 条件是:

  1. 数字的二进制表示形式必须具有相同的0和1。
  2. 从左向右读取时,数字的二进制表示形式在任何时候都不能有大于1的0。 例如,156(1001 1100)不满足第二条件,因为第三位有两个0,只有一个1,而210(1101 0010)满足这些条件。

我正在使用函数实现,并且针对这两个条件使用了单个函数,并且代码的一部分是:

int checkOneToZero(unsigned int num) {
    unsigned int carry = 7, 
        counterOne = 0, 
        counterZero = 0, 
        ct = 0;

    while ((carry > 0) || (carry == 0)) {
        if ((num >> carry) & 1) {
            counterOne = binaryAddition(counterOne, 1);
            ct ++;
            printf(" %d ", ct); 
        }
        else {
            counterZero = binaryAddition(counterZero, 1);
            ct ++;
            printf(" %d ", ct); 
        }

        carry = binarySubtraction(carry, 1);
        printf(" CARRY %d \n", carry);

        if (counterZero > counterOne) {
            printf(" breakCounterZero %d breakCounterOne %d ", counterZero, counterOne);
            return 0;
        }
    }

    printf("successCounterZero = %d successCounterOne = %d", counterZero, counterOne);

    if (counterZero == counterOne)
        return 1;

    return 0;
}

我经常有错误的输出,因此请放置一些不会影响代码以跟踪问题的控制机制。 这些是:

  • ct:计算它是否在while循环中进入了多少次。

  • printf(“ CARRY%d \\ n”,进位):显示进位后的值减一。

  • printf(“ breakCounterZero =&d breakCounterOne =%d”):如果卡在“ if(counterZero> counterOne)”处,则显示0和1个计数,这将检查0计数不能大于每个while循环结束时的1计数。

  • printf(“ successCounterZero =%d successCounterOne =%d”):显示它是否已通过while循环。

我的问题是,如果我尝试让while循环工作,直到进位最后一次使用进位= 0,它会给出210的输出,这应该在它循环8次时起作用,而在CARRY = -1时,它应该从循环中断开喜欢:

1  CARRY 6
2  CARRY 5
3  CARRY 4
4  CARRY 3
5  CARRY 2
6  CARRY 1
7  CARRY 0
8  CARRY -1
9  CARRY -2
breakCounterZero 5 breakCounterOne 4

因此它比原先循环的时间多了1次,并且使计数多了0次,所以失败了。 但是我将进位限制增加到while循环中的1,以查看发生了什么,它给出了:

1  CARRY 6
2  CARRY 5
3  CARRY 4
4  CARRY 3
5  CARRY 2
6  CARRY 1
7  CARRY 0
successCounterZero = 3 successCounterOne = 4

因此它通过了第三个条件,但比第一个条件少了0,因此在第二个条件下失败了。

这似乎是一个复杂且过于具体的问题,但感谢您的任何提示。

我不确定您的binaryAdditionbinarySubtraction函数是需要使用它们还是只是为了满足不使用算术运算的条件而使用它们。

对于这种简单的情况,值得指出的是,您可以使用整数中的位“计数”多达31个。 当然足以处理8个可能的值:

int checkOneToZero(unsigned num) 
{
    unsigned count_0s = 0;
    unsigned count_1s = 0;

    // Using a 'for' loop here because I know the start, stop, and update.
    for (unsigned check_bit = 1 << 7; check_bit; check_bit >>= 1) {
        if (num & check_bit) {
            /* ++count_1s; */
            count_1s |= (count_1s << 1) | 1;
        }
        else {
            /* ++count_0s; */
            count_0s |= (count_0s << 1) | 1;

            if (count_0s > count_1s) return 0;
        }
    }

    return count_0s == count_1s;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM