[儿童问题]写一个反转2进制位的函数
有没有简单优雅的方法:
写一个函数 unsigned RevBit(unsigned val);
unsigned x = RevBit(0xf0ec9999);
x应该为 0x9999370f。
0xf0ec9999 == 11110000111011001001100110011001(二进制)
0x9999370f == 10011001100110010011011100001111(二进制)
谢谢!
给出思路的也可!!!!!
[解决办法]
把一个32位整数按位反转,即第1位转到第32位,第2位转到第31位,依次下去。一牛人写的算法如下:
unsigned int bit_reverse(unsigned int n)
{
n = ((n >> 1) & 0x55555555) | ((n << 1) & 0xaaaaaaaa);
n = ((n >> 2) & 0x33333333) | ((n << 2) & 0xcccccccc);
n = ((n >> 4) & 0x0f0f0f0f) | ((n << 4) & 0xf0f0f0f0);
n = ((n >> 8) & 0x00ff00ff) | ((n << 8) & 0xff00ff00);
n = ((n >> 16) & 0x0000ffff) | ((n << 16) & 0xffff0000);
return n;
}
第一行代码为奇偶位相互交换;第二行为以两位为一单元,奇偶单元进行交换;第三行为以四位为一单元,奇偶单元进行交换;第四行为以八位为一单元,奇偶单元进行交换;最后一行为以十六位为一单元,奇偶单元进行交换。至此,32位反转完成,算法结束。
[解决办法]
int resever(int input)
{
int ret = 0;
for(i = 0; i < sizeof(int) * 8 - 1; i++)
{
ret |= input & 1;
input >>= 1;
ret <<= 1;
}
return ret;
}
[解决办法]
#include "stdio.h"
#define N 32
void main()
{
unsigned long a = 0xf0ec9999;
//unsigned long a = 0x00009990;
unsigned long b = 0;
int arr[N]={0};
int i = 0;
for(i=0; i<N; i++)
{
arr[i] = a%2;
a = a/2;
}
for(i=0; i<N; i++)
b = b*2 + arr[i];
printf("%0x\n", b);
}
[解决办法]
unsigned int bit_reverse(unsigned int n)
{
int i;
int rightflag = 0x80000000;
int leftflag = 0x01;
int rightvalue, leftvalue;
for(i = 0; i < 16; i++){
rihtvalue = (n & (rightflag >> i) >> (32 - 2 * i);
leftvalue = (n & (leftflag << i) << (32 - 2 * i);
n = (n & (leftflag << i) | rightvalue;
n = (n & (rightflag >> i) | leftvalue;
}
return n;
}
呵呵,不知道可不可以!你试一试吧!
[解决办法]
unsigned int bit_reverse(unsigned int n)
{
int i;
int len;
unsigned int x;
len = sizeof(n) * 8;
for (i = 0; i < len; i++){
x <<= 1;
x = x + (n % 2);
n >>= 1;
}
return x;
}
[解决办法]
以下是一个语句较少但效率不是最高的算法:
[code=C/C++][/code]
#define COUNT 32
unsigned int BitRev(unsigned int input)
{
unsigned int ret, i;
for(ret = i = 0; i < COUNT; i++)
{
ret = (ret << 1) | ((input & (1 << i)) >> i) ;
}
return ret;
}
[解决办法]
unsigned BitRev(unsigned input)
{
unsigned ret = 0;
for(unsigned i = 0; i < COUNT-1; ++i)
{
ret |= input & 1;
input >>= 1;
ret <<= 1;
}
ret |= input;
return ret;
}
支持这个
[解决办法]
- C/C++ code
for( int i = 31; i>=0 ; i-- ) printf( "%d",( ( val >>(31-i)) & mark ));
[解决办法]
[code=C/C++][/code]
unsigned int BitRev2(unsigned int input)
{
unsigned int ret, i;
for(ret = 0, i = 1; i > 0; i = i << 1)
ret = (ret << 1) | ((input & i) ? 1 : 0);
return ret;
}
[code=C/C++][/code]
[解决办法]
[code=C/C++][/#define UNSIGNED_BITS_COUNT 32
unsigned int BitRev3(unsigned int input)
{
unsigned int ret, i;
for(ret = i = 0; i < UNSIGNED_BITS_COUNT; i++, input = input >> 1)
ret = (ret << 1) | (input & 1);
return ret;
}
]