把一个字节按位翻转排列解决方案
把一个字节按位翻转排列
例如一个字节的位排列为:0110 1010。翻转即为:0101 0110。
用C代码高效实现。谢谢!
第一次发问,也不知道自己有多少分,见笑了。
------解决方案--------------------
例如一个字节的位排列为: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; }