用半字节反转整数半字节的逻辑 [英] Logic for reverse an integer nibble by nibble
本文介绍了用半字节反转整数半字节的逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
大家好,
我在一次采访中被一个问题询问,如何逐字节地反转一个int数字
例如:
我有一个整数值
int a = 0x12 34 56 78;
i希望通过
来反转它>
b = 0x87 65 43 21;
任何人都可以为此给出一个逻辑
谢谢
shan
解决方案
有几种方法要做到这一点:但最简单的可能就是使用指针:
#define byte unsigned char
int main()
{
int a = 0x12345678;
int b;
byte * pa =(byte *)& a;
byte * pb =(byte *)& b;
*(pb + 0 )= *(pa + 3 );
*(pb + 1 )= *(pa + 2 );
*(pb + 2 )= *(pa + 1 );
*(pb + 3 )= *(pa + 0 );
b =((b>> 4 )& 0x0F0F0F0F)| ((b& 0x0F0F0F0F)<< 4 ); // ADDED这个用于半字节交换
printf( %x:%x \ n,a,b);
}
:doh:没有注意到半字节交换![/ edit]
int rev_nibbles( int x )
{
int y = 0 ;
while (x)
{
y<< = 4 ;
y | = x& 0xF;
x>> = 4 ;
}
return y;
}
除了OriginalGriff,按位反转在这里:
< pre lang =cs> #include< stdio.h>
int main(){
int i;
// 将其大小设置为位数
< span class =code-keyword> int sizeint = sizeof ( int )* 8 ;
// 给定数字
unsigned int given = ~2;
// 反转值
unsigned int reversed = 0 ;
// 位测试
unsigned int test = 1 ;
// 每位
for (i = 0 ; i< sizeint; i ++){
// 测试该位是否设置
如果(给定& test)
reverse | = 1 ;
// 下一位
test<< = 1 跨度>;
// 位移以准备下一个
if (test)
reverse<< = 1 ;
}
printf( given =%x,reverse =%x \ n,给定,反转);
return 0 ;
}
hi all,
I was asked by a question in a interview, how to reverse a int number byte by byte
for example:
I am having a integer value
int a=0x12 34 56 78;
i want to reverse it by
b=0x87 65 43 21;
can anyone plz give a logic for this
Thanks
shan
解决方案
There are a couple of ways to do this: but the simplest is probably to use pointers:
#define byte unsigned char int main() { int a = 0x12345678; int b; byte* pa = (byte*)&a; byte* pb = (byte*)&b; *(pb + 0) = *(pa + 3); *(pb + 1) = *(pa + 2); *(pb + 2) = *(pa + 1); *(pb + 3) = *(pa + 0); b = ((b >> 4) & 0x0F0F0F0F) | ((b & 0x0F0F0F0F) << 4); //ADDED This for nibble swapping printf( "%x:%x\n",a, b ); }
[edit]:doh: Didn't notice the nibble swap as well![/edit]
int rev_nibbles(int x) { int y = 0; while (x) { y <<= 4; y |= x & 0xF; x >>= 4; } return y; }
in addition to OriginalGriff, bitwise reverse is here:
#include <stdio.h> int main() { int i; // set size of it as bit count int sizeint=sizeof(int)*8; // given number unsigned int given=~2; // reversed value unsigned int reversed=0; // bit test unsigned int test=1; // for each bit for(i=0; i<sizeint; i++) { // test if that bit set if(given&test) reversed|=1; // next bit test<<=1; // bit shift to prepare next if(test) reversed<<=1; } printf("given=%x, reversed=%x\n", given, reversed); return 0; }
这篇关于用半字节反转整数半字节的逻辑的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文