用半字节反转整数半字节的逻辑 [英] Logic for reverse an integer nibble by nibble

查看:93
本文介绍了用半字节反转整数半字节的逻辑的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

大家好,



我在一次采访中被一个问题询问,如何逐字节地反转一个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屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆