Yon*_*ing 5 algorithm bit-manipulation
我试图在一个字节中做一点反转.我使用下面的代码
static int BitReversal(int n)
{
int u0 = 0x55555555; // 01010101010101010101010101010101
int u1 = 0x33333333; // 00110011001100110011001100110011
int u2 = 0x0F0F0F0F; // 00001111000011110000111100001111
int u3 = 0x00FF00FF; // 00000000111111110000000011111111
int u4 = 0x0000FFFF;
int x, y, z;
x = n;
y = (x >> 1) & u0;
z = (x & u0) << 1;
x = y | z;
y = (x >> 2) & u1;
z = (x & u1) << 2;
x = y | z;
y = (x >> 4) & u2;
z = (x & u2) << 4;
x = y | z;
y = (x >> 8) & u3;
z = (x & u3) << 8;
x = y | z;
y = (x >> 16) & u4;
z = (x & u4) << 16;
x = y | z;
return x;
}
Run Code Online (Sandbox Code Playgroud)
它可以反转该位(在32位机器上),但是有一个问题,例如,输入是10001111101,我想得到10111110001,但是这个方法会反转整个字节,包括标题0s.输出为10111110001000000000000000000000.是否有任何方法只能反转实际数字?我不想将其转换为字符串和反转器,然后再次转换.有没有纯数学方法或位操作方法?
最好的祝福,
俗气的方法是移动直到你在右边得到 1:
if (x != 0) {
while ((x & 1) == 0) {
x >>= 1;
}
}
Run Code Online (Sandbox Code Playgroud)
注意:您应该将所有变量切换为unsigned int. 正如所写的,每当右移时,您都可能会出现不需要的符号扩展。