虽然循环迭代的次数多于或少于

时间:2016-03-24 23:17:19

标签: c while-loop binary binary-operators

奥斯汀黑斯廷斯和迈克尔伯尔的答案已经解决了我的问题,这个循环总是正确的,因为我刚刚意识到并且它像奥斯汀黑斯廷斯那样解决了。由于它是评论,因此无法标记为答案。谢谢你的帮助!

我在C中有一个赋值,它只打印128到255之间的特定种类的数字(所以8位二进制表示),我应该不使用任何算术运算符。条件是:

  1. Number的二进制表示必须具有相同的0和1的数字。
  2. 从左到右阅读时,数字的二进制表示在任何时刻都不能超过1。例如,156(1001 1100)不符合第二个条件,因为有两个0,第三个数字只有一个1,而210(1101 0010)满足这些条件。
  3. 我正在使用功能实现,并为这两个条件使用了单个函数,代码的一部分是:

    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”,carry):显示进位值减1后的值。

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

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

    我的问题是,如果我尝试让while循环工作,直到最后使用carry = 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,因此在第二个条件下失败。

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

1 个答案:

答案 0 :(得分:0)

我不确定您的binaryAdditionbinarySubtraction函数 - 是否需要使用它们,或者只是使用它们来满足不使用算术运算的条件。< / p>

对于这个简单的案例,值得指出的是,你可以&#34;计算&#34;使用整数中的位最多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;
}