【Leetcode】一個無符號的整數,如何翻轉其二進制位?
方法一:可以采用下面的方法,以32位整數為例:
unsigned int v; // 32-bit word to reverse bit order
// 相鄰兩位互相交換
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555) << 1);
// 相鄰的一對互相交換
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// 相鄰的一組(4位)互相交換
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// 相鄰的一組(8位)互相交換
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// 相鄰的一組(16位)互相交換
v = ( v >> 16) | ( v << 16);
// 第1步:對調相鄰的1位(abcd efgh-> badc fehg)
v = ((v >> 1) & 0x55555555) | ((v & 0x55555555)<< 1);
// 第2步:對調相鄰的2位(abcd efgh-> cdab ghef)
v = ((v >> 2) & 0x33333333) | ((v & 0x33333333) << 2);
// 第3步:對調相鄰的4位(abcd efgh-> efgh abcd)
v = ((v >> 4) & 0x0F0F0F0F) | ((v & 0x0F0F0F0F) << 4);
// 第4步:對調相鄰的8位(相鄰的字節)
v = ((v >> 8) & 0x00FF00FF) | ((v & 0x00FF00FF) << 8);
// 第5步:對調相鄰的16位(相鄰的兩字節)
v = ( v >> 16 ) | ( v << 16);
經過上面的步驟,一個32位整數的二進制位已經翻轉了。上面的對調步驟是互不干擾的,因此順序可以倒過來,也就是先對調相鄰16位,然后是8位、4位、2位和1位。
也可以使用下面這個方法:
//也可以使用循環
#include <stdio.h>
#include <stdlib.h>
int main(int argc, char const *argv[])
{
unsigned int a;
scanf("%d", &a);
unsigned int reversed_a = 0;
for(int i = 0; i < 32; i++)
{
/* 左移騰出空位 */
reversed_a = reversed_a << 1;
/* 與上最后一位 */
reversed_a |= (a & 0x1);
/* 右移,將要移位的放到最后一位上 */
a = a >> 1;
}
printf("%u", reversed_a);
system("pause");
return 0;
}

浙公網安備 33010602011771號