簡體   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