前往
大廳
主題

位元反轉(bit reversal)與位元補充(bitwise complement)

Yang | 2022-10-28 10:29:33 | 巴幣 0 | 人氣 788

參考dadalaohua大的文章:

反轉byte內的bits,不像反轉集合內的元素順序,呼叫List<T>.Reverse()即可完成,效能要好,要設計出速度夠快的演算法,不容易

原文是C語言,在此微調成C#版本,並附上單元測試

之前文章沒對位元補充(bitwise complement)做單元測試,也在這裡補充紀錄


public static byte Reverse(byte value)
{
    value = (byte)(((value & 0xaa) >> 1) | ((value & 0x55) << 1));
    value = (byte)(((value & 0xcc) >> 2) | ((value & 0x33) << 2));

    return (byte)((value >> 4) | (value << 4));
}

public static uint Reverse(uint value)
{
    value = ((value & 0xaaaaaaaa) >> 1) | ((value & 0x55555555) << 1);
    value = ((value & 0xcccccccc) >> 2) | ((value & 0x33333333) << 2);
    value = ((value & 0xf0f0f0f0) >> 4) | ((value & 0x0f0f0f0f) << 4);
    value = ((value & 0xff00ff00) >> 8) | ((value & 0x00ff00ff) << 8);

    return (value >> 16) | (value << 16);
}

單元測試:

//位元反轉(bit reversal)
Convert.ToString(BitOperator.Reverse(0b_0000_1010),2).PadLeft(8,'0')
"01010000"
Convert.ToString(BitOperator.Reverse((uint)0b_0000_1010),2).PadLeft(32,'0')
"01010000000000000000000000000000"

Convert.ToString(BitOperator.Reverse(0b_1111_0101),2).PadLeft(8,'0')
"10101111"
Convert.ToString(BitOperator.Reverse((uint)0b_1111_0101),2).PadLeft(32,'0')
"10101111000000000000000000000000"

Convert.ToString(BitOperator.Reverse(0b_0000_0000),2).PadLeft(8,'0')
"00000000"
Convert.ToString(BitOperator.Reverse((uint)0b_0000_0000),2).PadLeft(32,'0')
"00000000000000000000000000000000"

Convert.ToString(BitOperator.Reverse(0b_1111_1111),2).PadLeft(8,'0')
"11111111"
Convert.ToString(BitOperator.Reverse((uint)0b_1111_1111),2).PadLeft(32,'0')
"11111111000000000000000000000000"

//位元補充(bitwise complement)
Convert.ToString((byte)~0b_0000_1010,2).PadLeft(8,'0')
"11110101"
Convert.ToString((byte)~0b_1111_0101,2).PadLeft(8,'0')
"00001010"
Convert.ToString((byte)~0b_0000_0000,2).PadLeft(8,'0')
"11111111"
Convert.ToString((byte)~0b_1111_1111,2).PadLeft(8,'0')
"00000000"
Convert.ToString(~0b00001010,2).PadLeft(32,'0')
"11111111111111111111111111110101"
Convert.ToString(~0b11110101,2).PadLeft(32,'0')
"11111111111111111111111100001010"

單元測試正常
送禮物贊助創作者 !
0
留言

創作回應

更多創作