读书人

把一个字节按位翻转排列解决方案

发布时间: 2012-03-18 13:55:38 作者: rapoo

把一个字节按位翻转排列
例如一个字节的位排列为:0110 1010。翻转即为:0101 0110。
用C代码高效实现。谢谢!
第一次发问,也不知道自己有多少分,见笑了。

[解决办法]

C/C++ code
#include <stdio.h>void    ShowBit(unsigned int x, int n){    if (--n) ShowBit(x>>1, n);    printf("%d", x%2);}void    ReverseBit(unsigned int* pValue){    unsigned int n = *pValue;    n = (n&0x55555555)<<1|(n&0xAAAAAAAA)>>1;     n = (n&0x33333333)<<2|(n&0xCCCCCCCC)>>2;     n = (n&0x0F0F0F0F)<<4|(n&0xF0F0F0F0)>>4;     n = (n&0x00FF00FF)<<8|(n&0xFF00FF00)>>8;     n = (n&0x0000FFFF)<<16|(n&0xFFFF0000)>>16;    *pValue = n;}int main(){    unsigned int x = 0x6A;    ShowBit(x, 32); printf("\n");    ReverseBit(&x);    ShowBit(x, 32); printf("\n");    return 0;}
[解决办法]
int reserv(int n)
{
int i;
int r = 0;
for(i=0;i<sizeof(n)*8; i++)
{
r |= (n&1);
n >> 1;
r << 1;
}
return r;
}
[解决办法]
C/C++ code
int ReverseBits(int number){    int result, modVal;    int i;        modVal = 1 << 31;    number <<= 24;    //if reverse an Integer number, please comments this line    result = 0;        for(i = 0; i < 8; i++)    {        if((number & modVal) != 0)            result |= (1 << i);        number <<= 1;    }        return result;} int main(void){    printf("%d", ReverseBits(1));    return 0;}
[解决办法]
//改一下,改成动态分配,上面也有点BUG,memset应该放WHILE里去

C/C++ code
#include <stdio.h> #include <stdlib.h> #include <string.h>typedef struct {     unsigned char bit_1 : 1;     unsigned char bit_2 : 1;     unsigned char bit_3 : 1;     unsigned char bit_4 : 1;     unsigned char bit_5 : 1;     unsigned char bit_6 : 1;     unsigned char bit_7 : 1;     unsigned char bit_8 : 1; }bit;void Dec2Bin(int *a,char *b,int n=1) //将数据转换为N个字节,默认为1个字节 {     bit *p_bit;     int j;         p_bit=(bit *)a;    for(j=n-1;j>=0;j--)     {         *b++=(p_bit+j)->bit_8;         *b++=(p_bit+j)->bit_7;         *b++=(p_bit+j)->bit_6;         *b++=(p_bit+j)->bit_5;         *b++=(p_bit+j)->bit_4;         *b++=(p_bit+j)->bit_3;         *b++=(p_bit+j)->bit_2;         *b++=(p_bit+j)->bit_1;             } }void StrTurn(char *str,int n=1) //将N个字节倒序排列,默认为1个字节{    char *p,*q;    char temp;    p=str;    q=str+n*8-1;    while(p<q)    {        temp=*p;        *p=*q;        *q=temp;        p++;        q--;    }}int main() {     int a,i,n;     char *b;      while(printf("请输入要转换的数据和字节数:\n"),scanf("%d%d",&a,&n)!=0)    {        b=(char *)malloc(n*8+1);        memset(b,2,n*8+1);        Dec2Bin(&a,b,n);         printf("%d的二进制形式为:\n",a);        for(i=0;b[i]!=2;i++)             printf("%d ",b[i]);         printf("\n\n");         StrTurn(b,n);        printf("翻转后%d的二进制形式为:\n",a);        for(i=0;b[i]!=2;i++)             printf("%d ",b[i]);         printf("\n\n\n");         free(b);    }    return 0; } 

读书人网 >C语言

热点推荐