2012-03-30 3 views
-2
// input, output, i, and k are uint16_t type 
// It is assured that k is non-negative and "small enough" 
// k = 4 
// input = 0x3a44 
output = 0; 
for (i=k; i<16; i++){ 
if (input & 1<<i) 
output = output | 1 <<(i-k); 
} 

ので、入力= 0011 1010 0100 0100 K = 4または0000 0000 0000 0100とのループは私が私を混乱さなんと12回このcスニペットは何をしますか?

を実行はifと出力部が作業している方法です、私は知っていますビット演算子&と|そして左シフトは、私がinputi番目のビットがセットされている場合は、ループの全体的な機能は、出力で、その後i-k番目のビットがiため、

+3

非常に興味深い。 – DRVic

+0

あなたの非常に狭い興味に対する非常に狭い興味。 – tubby

答えて

2

明らかに、出力を入力の右にシフトされた4ビット(またはKに割り当てられた値)。

+0

これを知っていると、反復でこれを行う目的は何と言いますか?一度に1ビットずつ操作を示しているだけでしょうか? –

+0

@ JohnP:理由は、著者に起こったことが原因だったと思います。 –

+0

コメントの表現のおかげで、私はソースを見つけることができました。 http://www.cs.colostate.edu/~cs270/.Spring12/schedule.shtml - > http://www.cs.colostate.edu/~cs270/.Spring12/Assignments/PA4/NewPA4.pdf - CS 270、 'More Assembly Programming ループと条件文'を参照してください。私は、「k」の制約を導入して、学生が範囲外の値の効果を実験しなければならないように設計されていると信じています。 (制御構造は7週間早く、トラップについて学ぶ前に準備/レビューしていたかもしれません)。 –

2

設定されているもので迷子..but < <であること1 << nは1

に設定し、1ビットだけ、位置 nで、すなわち一つを有する整数であるため、 k〜15 output | (1 << n)の値の範囲は、あなたが outputを取り、1に n番目のビットを設定することで得るものです
0

これは右へのkビットの論理シフトです。なぜoutput = input >> k;が使用されていないのですが、私はCエキスパートではありません

+0

これは、すべてのコンテキストを含むスニペットではなく、より大きなCサンプルのスニペットです。これは未使用変数を説明し、その使用はループのモチベーションを説明するのに役立ちます。 –

0

このような高密度コードを理解しようとするときは、紙の上に値の表を書き出し、ループから各項目を手動で計算してみてください。

Excelで快適な場合は、スプレッドシートとして作成してください。ループの反復ごとに1行を持つことができます。必要に応じて、その行は前の行を参照できます(変数outputを使用する必要があります)。ループを展開し、中間値((1<<i)1<<(i-k)のようなもの)を表示することで、何が起こっているかをよりよく知ることができます。

関連する問題