7

私はK&R Cプログラミング言語の本を読んでいて、次のような演習2-6で立ち往生しています。

位置pから始まるnビットをyの右端のnビットに設定してxを返す関数setbits(x、p、n、y)を記述し、他のビットは変更しないでください。

彼らが私に求めていることを正確に理解するのに苦労しています。私はここで考えられる答えを見ましたが、それでも私は本当に理解していません。私を失望させているのは言葉遣いだと思います。誰かが私に何を求めているのかを別の方法で説明できますか?別の言い回しが、コードに関して何をする必要があるかを理解するのに役立つことを願っています。

4

6 に答える 6

13

Aviの答えを説明する:

int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011

あなたの i = 0xAB と言ってください。バイナリでは、これは 10101011 です。

各ビット位置に番号を付けましょう。

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   1

右端のビット (最下位) は位置「0」です。一番左の (最も重要な) 位置は「7」です。

したがって、次の 2 つの値 p と n は、「ビット p から始まる n ビットを変更したい」ということです。したがって、p=5 で n=3 の場合、ビット番号 5 から開始し、合計で 3 ビットを変更します。これはビット 5、4、3 を意味します。この例では「101」です。

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   1
                   |         |
                    ---------
               (Modifying these three bits)

それらをどのように変更していますか?それらを交換しています。別の 3 ビットのセット。y の最下位 3 ビット。

だからここにyがあります:

Position #: 7   6   5   4   3   2   1   0
Bit:        1   0   1   0   1   0   1   0 

右端のビットは、ビット 2、1、0 または値「010」になります。もちろん、n の値が 6 の場合、i の 6 ビットを "101010" (右端の 6 ビット) に置き換える必要があります。

したがって、あなたの仕事は、i から指定されたビット (この場合は「101」) を取得し、それらを y の指定されたビット (「010」) に置き換えることです。

これを行うと、戻り値は

1 0 1 0 1 0 1 0

于 2009-09-12T20:03:30.920 に答える
3

例えば:

int i = setbits(0xAB = b10101011, 5, 3, 0xAA = b10101010);
i equals 0x93 = b10010011

x(101)の位置5から始まる3ビットを取得し、y(010)の右端の3ビットに置き換えます。

于 2009-09-12T19:18:02.453 に答える
3

その「考えられる答え」は、コメントのない単なるコードです。それがあなたを助けなかったのも不思議ではありません。

質問 (およびおそらく回答者) は、ビット フィールドに精通していることを前提としています。この種のことは、ハードウェアレジスタを制御する組み込みプログラミングでは非常に一般的です。

とりわけ、オーディオの音量レベルを設定するレジスタがあるとします。同時に、スピーカーやマイクなどを選択できる場合もあります。ビットは次のようになります。

ssAAAmxx -- 各文字は、その数値内のビットフィールドを表します。音量を変更するには、「AAA」の値を変更する必要があります。ここで、ボリュームを調整できるプログラムがプログラムにあるとします。これは単純なコントロールで、常に 0 ~ 7 の数値を返します。その形式は次のようになります。

xxxxxAAA -- 次に、ここから AAA ビットを取り出し (「y」と呼びます)、A 以外のビットを変更せずに、上記の番号 (「x」と呼びます) に設定します。したがって、問題は次のようになります。「y の右端の 3 ビットを取り、ビット 5 から始めて x に設定します (ビットは 0 から数えることを思い出してください。次に、この例の 3 と 5 は n と p になります。元の問題。

于 2009-09-12T19:34:41.430 に答える
2

操作は「ビットフィールド挿入」です

yは通常nビット未満であるという考え方ですが、そうでない場合は、 nのみを使用してください。英語では、タスクは、フィールド幅nを使用して、 pから始まるxにyを挿入することです。

于 2009-09-12T19:18:49.137 に答える
0

p位置から始まるxのnビットをyの右端のnビットに置き換えます。

getbits()そしておそらくあなたは2.9章のルーチンを利用するべきです

于 2009-09-12T19:25:16.870 に答える