描述
以下提供三種方式(第三種偶然想到的, 哈哈哈, 還挺簡潔的)
第一種方式
這個解法比較常規, 思路是初始化一個數組(默認值爲0),
然後將每一位取出來, 替換數組中相應的值, 因爲取二進制的時候
是從右往左取, 並且存入數組的時候是從左往右存, 那麼得到的數
組直接就是逆序後的序列.
void reverse_bits(unsigned int value)
{
int result_buffer[32] = { 0 };
int* Tag = result_buffer;
while (value != 0)
{
int temp = value / 2;
*Tag++ = value - temp * 2;
value /= 2;
}
int i;
for (i = 0; i < 32; i++)
{
printf("%d", result_buffer[i]);
}
}
第二種方式
這個是上一種方法的改進版, 採用了一種獨特的方式,
採用了二進制數對原數進行校驗(即2的次方, 這樣用來校驗的
數以二進制的形式只有一位是1), 用邏輯與的方式將這個十進制
數記錄下來, 並且存入數組中.
void reverse_bits(unsigned int value)
{
int result_buffer[32] = { 0 };
int i;
for (i = 0; i < 32; i++)
{
int temp = (value & (int)pow(2,i)) != 0 ? 1 : 0;
result_buffer[i] = temp;
}
for (i = 0; i < 32; i++)
{
printf("%d", result_buffer[i]);
}
}
第三種方式
這個方法是基於第二種方法上做了一些改進, 我們既然能夠
求出每一位, 那麼我們爲什麼不能直接用二進制拼湊這個數呢?
只需要簡單的左移, 相對於得到一個數組的侷限性, 一個具體的
數值顯然更加靈活, 並且更加符合題意.
unsigned int reverse_bits(unsigned int value)
{
unsigned int result = 0;
int i;
for (i = 0; i < 32; i++)
{
result += (((value & (int)pow(2, i)) != 0 ? 1 : 0) << (31-i));
}
printf("%u", result);
return result;
}