2016-03-24 14 views
0

オースティンヘイスティングスとマイケル・バーのアンワースが私の問題を解決しましたが、このループは常に現実のものですが、オースティン・ヘイスティングスのようなときに解決されました。それはコメントであるため、答えとしてマークすることはできません。ご協力いただきありがとうございます!ループは繰り返しますそれより多いか小さいか

私は128から255の間で特定の種類の数字だけを出力するという割り当てをしています(8桁のバイナリ表現)。算術演算子を使用せずにそれを行う必要があります。条件は次のとおりです。

  1. 数値のバイナリ表現は、0と1の同じ数でなければなりません。
  2. 数値のバイナリ表現は、左から右に読むときには、常に0より大きくなることはできません。たとえば、156(1001 1100)は3桁目に2つの0と1つしかないため、210(1101 0010)はこれらの条件を満たすため、2番目の条件を満たすことはありません。

    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:ifまたはelseループに入力された回数をカウントします。

  • printf( "CARRY%d \ n"、キャリー):キャリーの値が減少した後の値を示します。

  • のprintf( "breakCounterZero = & DのbreakCounterOne =%のD")が縮退している場合、 "IF(counterZero> counterOne)" 0と1の数を示す0カウントが終了時に1つのカウントよりも高くすることができないチェックしますそれぞれのwhileループ。

  • printf( "successCounterZero =%d successCounterOne =%d"):whileループを通過したかどうかを示します。

私はキャリーがキャリー= 0と最後に使用されるまで、それが8回ループしてCARRYでとして働くべき、210の出力を与えるループ作業しながら、聞かせしようとすると、私の問題は= -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 1以上を数えます。しかし、温首相は、私は何が起こるかを見るために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 

をので、それは第三の条件が、1つ、それはそう第二の条件で失敗すべきであるよりも、0以下を渡します。

これは複雑であまりにも具体的な質問ですが、ヒントはありがたいです。

+0

あなたの問題が「キャリー」である限り、キャリー= 1 << 7;を使用して実装を変更してから、whileキャリーを実行することができます){...;キャリー>> = 1; } ' –

+1

'((キャリー> 0)||(キャリー== 0)) 'は、 '符号なしintキャリー'に対して常に真です。 –

答えて

0

binaryAdditionbinarySubtractionの機能については、使用する必要があるのか​​、単に算術演算を使用しないという条件を満たすために使用するのかはわかりません。

この単純なケースでは、整数のビットを使用して31まで「カウント」できることを指摘する価値があります。

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; 
} 
+0

はい、コメントだったので投稿を編集しました。 binaryAdditionとsubtractionはうまく機能していますが、私は与えなかった算術方程式の代わりに作成しましたが、あなたのやり方にも感謝しました。私はbinarySubtraction関数も必要ありません。あなたの詳細な答えをありがとう。 – morpheus

関連する問題