4

演習 2-6. 位置 p から始まる n ビットを y の右端 n ビットに設定して x を返す関数 setbits(x,p,n,y) を作成し、他のビットは変更しません。

私はこの機能を紙の上で1、2時間いじろうとしてきましたが、どこにも行きません.

私が関数を解釈する方法は、任意の長さのビット フィールド x は、右端のnビットから開始するビットを調べることです。これらのビットを、任意の長さのビット フィールド y の右端のビットにある同じビットにp変更します。nn

例: p = 7 n = 9x が一番上のフィールド、y が真ん中、結果が一番下のフィールドです。

ここに画像の説明を入力


任意のサイズのビット フィールドでこれを行う方法を判断するのに苦労しています。使用するsizeof(x) * 8必要がありますか、それとも不要ですか?

このような関数を作成する方法について、ヒントをいただければ幸いです。

また、演習の他の解釈も知りたいです。おそらく、これは実行できると確信していますが、より簡単なバージョンです。時間がかかっていることを考えると、この件に関するセカンドオピニオンをいただければ幸いです。

4

2 に答える 2

4

xとは int であるためy、ビット フィールドのサイズは int のビット数を超えることはできません。

これはCなので、右端のビットを#0と仮定して、 の右端のビットp = 0, n = 1を置き換えることを意味しxます。

あなたがしたいことは次のとおりです。

  1. ビットマスクを作成します -- 右端のnビットが 1 に設定され、残りがすべて 0 に設定された数値。

  2. の右端のビットを抽出し、左のビットをシフトするためのビットandマスク。ynyp

  3. pビットマスクビットを左にシフトしてn、 position から始まるビットで動作するビットマスクを作成しpます。

  4. and逆シフトされたビットマスクをビット単位でx使用して、置換するビットをマスクします。

  5. 2 と 4 の結果をビットごとに計算orして答えを取得します。

ロールオーバーしてコードで表示:

int ビットマスク = ~((~0) << n);
return ((ビットマスク & y) << p) | (~(ビットマスク << p) & x);

于 2013-03-29T07:03:06.750 に答える