1

私はいくつかのビットシフト操作をデバッグしようとしていますが、ビットシフト操作の前後に存在するビットを視覚化する必要があります。

この回答から、シフトからの埋め戻しを処理する必要があるかもしれないと読みましたが、それが何を意味するのかわかりません。

この質問(intのビットを印刷するにはどうすればよいですか)を尋ねることで、埋め戻しとは何か、そしておそらく他のいくつかの質問を理解できると思います。

これが私のこれまでのサンプルコードです。

    static string GetBits(int num)
    {
        StringBuilder sb = new StringBuilder();
        uint bits = (uint)num;
        while (bits!=0)
        {
            bits >>= 1;

            isBitSet =  // somehow do an | operation on the first bit.
                        // I'm unsure if it's possible to handle different data types here
                        // or if unsafe code and a PTR is needed

            if (isBitSet)
                sb.Append("1");
            else
                sb.Append("0");
        }
    }
4

2 に答える 2

11
Convert.ToString(56,2).PadLeft(8,'0') returns "00111000"

これは1バイト用で、intでも機能し、数値を増やすだけです

于 2014-08-07T20:17:34.423 に答える
9

最後のビットが設定されているかどうかをテストするには、次を使用できます。

isBitSet = ((bits & 1) == 1);

ただし、右にシフトする前に(後ではなく)そうする必要があります。そうしないと、最初のビットが欠落します。

isBitSet = ((bits & 1) == 1);
bits = bits >> 1;

ただし、より適切なオプションは、BitConverterクラスの静的メソッドを使用して、メモリ内の数値を表すために使用される実際のバイトをバイト配列に取得することです。この方法の長所(またはニーズによっては短所)は、コードを実行しているマシンのエンディアンを反映していることです。

byte[] bytes = BitConverter.GetBytes(num);

int bitPos = 0;
while(bitPos < 8 * bytes.Length)
{
   int byteIndex = bitPos / 8;
   int offset = bitPos % 8;
   bool isSet = (bytes[byteIndex] & (1 << offset)) != 0;

   // isSet = [True] if the bit at bitPos is set, false otherwise

   bitPos++;
}
于 2013-03-09T20:39:30.597 に答える