分享

无符号整型数的反转

 新用户79878317 2021-07-24

在编写这道题的程序时,费了老大劲才写出了这样的程序:(小白求轻拍)

unsigned char reverse_bit_char(unsigned char y) { int i = 0; unsigned char blank = 0x01; unsigned char num = 0; for (i = 7; i >0; i -= 2) { num = (y >> i)&(blank) | num; blank <<= 1; } blank = 0x80; for (i = 7; i >0; i -= 2) { num = (y << i)&(blank) | num; blank >>= 1; } return num; } unsigned int reverse_bit(unsigned int x) { unsigned short a = x / 0x10000; unsigned short b = x; unsigned char c = b / 0x100; unsigned char d = b; c = reverse_bit_char(c); d = reverse_bit_char(d); c = c^d; d = c^d; c = c^d; b = c * 0x100 + d; a = a^b; b = a^b; a = a^b; x = a * 0x10000 + b; return x; }

总共定义了两个函数,使用的方法是把int型数的32bit二进制先
拆分成高16bit位和低16bit位分别赋给short型的a和b,再把
16位的b
拆成两个8位二进制分别赋给char型的c和d;然后逐个
对c和d进行反转,再把c和 d的值进行交换后重新组成16位赋给
b,此时b就是一个原32位经过反转的高16位了,再把a和b进行
交换后重新组成32位二进制数为就得到了反转后的数。

  • 其实也想过整个32位数左右每个对应的数直接进行交换得到左右反转的
    结果,但感觉位数交换的操作进行太多次了,就另寻办法了。

  • 后来我发现这种方法实在是太繁琐了,就在CSDN上检索无符号
    整型数反转的方法
    ,下面记录这种方法:

unsigned int  reverse_bit(unsigned int value)
{
value = (value & 0x55555555) << 1 | (value & 0xAAAAAAAA) >> 1;
value = (value & 0x33333333) << 2 | (value & 0xCCCCCCCC) >> 2;
value = (value & 0x0F0F0F0F) << 4 | (value & 0x0F0F0F0F) >> 4;
value = (value & 0x00FF00FF) << 8 | (value & 0XFF00FF00) >> 8;
value = (value & 0x0000FFFF) << 16 | (value & 0xFFFF0000) >> 16;
return value;

}12345678910111234567891011

看起来就简短干净了很多,让我深深的感觉到了萌新跟大佬的差距。
这种方法是将int型的32bit二进制数通过相邻1,2,4,8,16位进行
交换然后得到反转的结果。举例来说假如把int型数最低字节的低4
编号为ABCD,执行
value = (value & 0x55555555) << 1 | (value & 0xAAAAAAAA) >> 1;
后这四位变为BADC;执行
value = (value & 0x33333333) << 2 | (value & 0xCCCCCCCC) >> 2;
语句后变为DCBA,这样就得到了低四位反转的结果;其他三条语句的
作用跟上述类似。

  • 这样经过简单的五行语句的计算后就能将一个unsigned int型的整数进行左右

  • 反转了!虽然语句理解起来也没有那么难,但不得不感叹程序猿实在是很强大,

  • 我们学习程序的路上也需要不断探究,不断掌握新的知识,日渐精进。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多