c - 仅使用 "~ & ^ | + << >> ="个运算符和 20 个运算实现逻辑右移

标签 c bitwise-operators

所以我有一个任务,我必须在 c 中编写一个函数,该函数仅使用 ~ 、 & 、 ^ 、 | 的按位运算。 、+、<<、>> 和 =。我只需要使用 20 个操作。而且我不允许使用控制结构,例如 if-else、for、while、switch 或任何其他在条件 block 中执行代码的结构。此外,类型转换也被淘汰了,函数头(给我的)中未声明的字节被限制为 1 个字节或 8 位值;所以我有十六进制 0 到 FF。

我必须编写的函数是逻辑右移。因此,不是用符号位填充位,而是用 0 填充位

这是我所做的:

int logicalShift(int x, int n) {
    int op=0xFFFFFFFF;
    int tcn=(~n+1);
    int sizeshift=0x20 & tcn;
    op=(op<<sizeshift);
    return ((x>>n) + (op));
}

这是我期望得到的(对于 x=0x80000000 和 n=0x01) 我希望得到 0x40000000,即十进制的 1073741824。这就是我得到的。 但是(对于 x=0x80000000,且 n=0x0 我希望得到 0x80000000,但是我得到 0x7fffffff,这是我的答案减去一点。我可以添加一点,但它弄乱了第一个答案。那么我做错了什么,我有一个案例而不是另一个案例。我也试过了。

int logicalShift(int x, int n) {
    int op=0xFFFFFFFF;
    int tcn=(~n+1);
    int sizeshift=0x20 & tcn;
    op=(op<<sizeshift);
    return ((x>>n) + (op  ^ ~n));
}

我认为,如果我对位集进行异或,将符号位清零,对于 0 的情况,我最终会得到一些非负数(又名)0x7fffffff,当它通过编译器转换为 2 的补码时。它最终使情况变得更糟。请给我指明正确的方向,我应该考虑什么以及为什么?

最佳答案

逻辑移位和算术移位的区别在于从左边移入的位。要根据算术实现逻辑移位,您可以进行算术移位,然后清除新位。在伪代码中:

  1. 生成一个掩码,当与结果进行与运算时,它将清除最左边的 n 位。
  2. 右移 n 位。
  3. 还有面具。

使用 AND 意味着您不必关心移入了哪些位。您只想无条件地将它们设置为 0。

接下来的问题是如何生成掩码。我会把它留给你作为练习。

关于c - 仅使用 "~ & ^ | + << >> ="个运算符和 20 个运算实现逻辑右移,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19203143/

相关文章:

c - 如果数组名不是变量也不是左值,那么它是什么?

java - ~ 在 Java 中是什么意思?

在 [R] 函数中发现段错误

c - 如何制作假代理导入库

algorithm - 加密算法和按位奇偶校验

kotlin - 在 Kotlin 中,为什么 (-1 ushr 4) 与 -1.ushr(4) 不同?

c - 如何在 C 中使用按位运算符判断一个数字是否等于另一个数字

javascript - 为什么 ~5 === -6 在 JavaScript 中?

c - 当所有元素都相同时快速排序复杂度?

c - 在 C 中没有库的输入和输出