gpt4 book ai didi

c - 整数的位反转,忽略整数大小和字节顺序

转载 作者:太空狗 更新时间:2023-10-29 17:16:03 26 4
gpt4 key购买 nike

给定一个整数类型定义:

typedef unsigned int TYPE;

typedef unsigned long TYPE;

我有以下代码来反转整数的位:

TYPE max_bit= (TYPE)-1;

void reverse_int_setup()
{
TYPE bits= (TYPE)max_bit;

while (bits <<= 1)
max_bit= bits;
}

TYPE reverse_int(TYPE arg)
{
TYPE bit_setter= 1, bit_tester= max_bit, result= 0;

for (result= 0; bit_tester; bit_tester>>= 1, bit_setter<<= 1)
if (arg & bit_tester)
result|= bit_setter;
return result;
}

只需要先运行 reverse_int_setup(),它存储一个最高位打开的整数,然后任何对 reverse_int(arg) 的调用都会返回 arg 及其反转位(用作二叉树的键,取自递增计数器,但这或多或少是不相关的)。

在调用 reverse_int_setup() 之后,是否有一种与平台无关的方法可以在编译时为 max_int 提供正确的值;否则,您是否认为有一种算法比我的 reverse_int() 算法更好/更精简

谢谢。

最佳答案

#include<stdio.h>
#include<limits.h>

#define TYPE_BITS sizeof(TYPE)*CHAR_BIT

typedef unsigned long TYPE;

TYPE reverser(TYPE n)
{
TYPE nrev = 0, i, bit1, bit2;
int count;

for(i = 0; i < TYPE_BITS; i += 2)
{
/*In each iteration, we swap one bit on the 'right half'
of the number with another on the left half*/

count = TYPE_BITS - i - 1; /*this is used to find how many positions
to the left (and right) we gotta move
the bits in this iteration*/

bit1 = n & (1<<(i/2)); /*Extract 'right half' bit*/
bit1 <<= count; /*Shift it to where it belongs*/

bit2 = n & 1<<((i/2) + count); /*Find the 'left half' bit*/
bit2 >>= count; /*Place that bit in bit1's original position*/

nrev |= bit1; /*Now add the bits to the reversal result*/
nrev |= bit2;
}
return nrev;
}

int main()
{
TYPE n = 6;

printf("%lu", reverser(n));
return 0;
}

这次我使用了 TK 中的“位数”想法,但通过不假设一个字节包含 8 位而是使用 CHAR_BIT 宏来使其更具可移植性。代码现在更高效(删除了内部 for 循环)。我希望这次代码也不那么神秘。 :)

使用 count 的需要是我们必须在每次迭代中移动一位的位置数不同 - 我们必须将最右边的位移动 31 个位置(假设 32 位数),第二个最右边的位移动 29岗位等。因此,随着 i 的增加,计数必须随着每次迭代而减少。

希望这些信息有助于理解代码...

关于c - 整数的位反转,忽略整数大小和字节顺序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63776/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com