gpt4 book ai didi

c - 2 的补码按位减法,考虑零情况

转载 作者:行者123 更新时间:2023-11-30 15:05:15 25 4
gpt4 key购买 nike

[硬件问题的一部分]

假设 2 的补码,32 位字长。仅允许使用有符号整型和常量 0 到 0xFF。我被要求仅使用运算符实现逻辑右移“n”位(0 <= n <= 31):! 〜& ^ | + << >>

我想我可以存储和清除符号位,执行移位,并将存储的符号位替换到新位置。

我想实现操作“31 - n”(不使用“-”运算符)来查找移位后存储的符号位的适当位置。

如果 n 是正数,我可以使用表达式:“31 + (~n + 1)”,但我不相信这在 n = 0 的情况下有效。

这是我到目前为止所拥有的:

int logicalShift(int x, int n) {
/* Store & clear sign bit, perform shift, and replace stored sign bit
in new location */
int bit = (x >> 31) & 1; // Store most significant bit
x &= ~(1 << 31); // Clear most significant bit
x = x >> n; // Shift by n
x &= ~((~bit) << (31 - n)); // Replace MSbit in new location

return x;
}

感谢任何帮助和/或提示。

最佳答案

[编辑:已解决]

感谢大家的帮助。在这种情况下,~n + 1 可以对 n 取反,包括 n = 0 的情况(它根据需要返回 0)。功能代码如下(绝不是最优雅的解决方案)。实用操作借自:How do you set, clear, and toggle a single bit?

int logicalShift(int x, int n) {
/* Store & clear sign bit, perform shift, and replace stored sign bit
in new location */
int bit = (x >> 31) & 1; // Store most significant bit
x &= ~(1 << 31); // Clear most significant bit
x = x >> n; // Shift by n
x ^= ((~bit + 1) ^ x) & (1 << (31 + (~n + 1))); // Replace MSbit in new location

return x;
}

关于c - 2 的补码按位减法,考虑零情况,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39949045/

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