gpt4 book ai didi

自定义 uint16_t 反向函数返回 0x8000

转载 作者:太空宇宙 更新时间:2023-11-04 00:36:38 25 4
gpt4 key购买 nike

    uint16_t ReverseInt16(uint16_t nonreversed) {
uint16_t reversed = 0;
reversed |= (nonreversed & 1 << 15) << 0; //check if bit 15 of nonreversed int is 1, if yes, write 1 to position 0, else write 0 to position 0
reversed |= (nonreversed & 1 << 14) << 1;
reversed |= (nonreversed & 1 << 13) << 2;
reversed |= (nonreversed & 1 << 12) << 3;
reversed |= (nonreversed & 1 << 11) << 4;
reversed |= (nonreversed & 1 << 10) << 5;
reversed |= (nonreversed & 1 << 9) << 6;
reversed |= (nonreversed & 1 << 8) << 7;
reversed |= (nonreversed & 1 << 7) << 8;
reversed |= (nonreversed & 1 << 6) << 9;
reversed |= (nonreversed & 1 << 5) << 10;
reversed |= (nonreversed & 1 << 4) << 11;
reversed |= (nonreversed & 1 << 3) << 12;
reversed |= (nonreversed & 1 << 2) << 13;
reversed |= (nonreversed & 1 << 1) << 14;
reversed |= (nonreversed & 1 << 0) << 15;
return reversed;
}

我需要对 uint16_t 进行位反转,所以我编写了这个函数,它逐位读取原始 uint_t,并将它们写入另一个 uint,但在反转位位置。问题是,当我传递大于 0x00 (0) 的整数时,函数返回 uint16_t 的最大值。

我是 c 位运算的初学者。

感谢您的回复。

编辑:“Best Algorithm for Bit Reversal (from MSB->LSB to LSB->MSB) in C”使用 32 位整数!

最佳答案

我看到两个问题(运算符优先级和错误的移位),让我们举个例子,您首先要做什么:

reversed |= (nonreversed & 1 << 15) << 0;

运算符优先级有误导性,&的优先级高于<<,那么应该是:

reversed |= (nonreversed & (1 << 15)) << 0;

现在让我们看看它做了什么,假设 nonreversed 是 100000000000000b,

那么(不可逆 & (1 << 15))是 100000000000000b & 100000000000000b,

这给出 100000000000000b

如果你将它移动 0,那么它仍然是 100000000000000b(然后第15位不移动到位置0),因此,如果你想反转位串,你需要说:

reversed |= (nonreversed & (1 << 15)) >> 15;

其他位也一样(注意运算符的优先级,并将位移动到正确的位置)。可以通过循环提高易读性。以下是我将如何实现它:

uint16_t ReverseInt16(uint16_t nonreversed) {
uint16_t reversed = 0;
for(uint16_t bit=0; bit<16; ++bit) {
reversed |= (uint16_t)((nonreversed & (1 << bit) != 0)) << (15 - bit);
}
return reversed;
}

表达式 nonreversed & (1 << bit) != 0 是一个 bool 值,当转换为 uint16_t 时,如果为假则表示 0,如果为真则表示 1。 1 是我在正确位置移动的零位置 (<< (15 - bit))。

关于自定义 uint16_t 反向函数返回 0x8000,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31441200/

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