用不带“的位操作表示(32-n)-&引用;登录C

用不带“的位操作表示(32-n)-&引用;登录C,c,C,因此,我目前正在从事一个涉及类的位操作的项目,其中一个规定是我们不能用“-”符号表示任何东西(例如,我必须写~0而不是写-1) 我想做一个右移n位,但我不能做像5>>(32-n)这样的事情,因为“-”符号,我不知道该怎么做 有人能告诉我吗?n位右移将使用“>>”运算符 5 >> n; 您在评论中给出了5的示例,您说真正的用例是: x >> (32 - n) 您可以使用位反转(例如,~0而不是-1),因此只需执行以下任一操作: x >> (32+(n * ~

因此,我目前正在从事一个涉及类的位操作的项目,其中一个规定是我们不能用“-”符号表示任何东西(例如,我必须写~0而不是写-1)

我想做一个右移n位,但我不能做像5>>(32-n)这样的事情,因为“-”符号,我不知道该怎么做


有人能告诉我吗?

n位右移将使用“>>”运算符

5 >> n;

您在评论中给出了5的示例,您说真正的用例是:

x >> (32 - n)
您可以使用位反转(例如,
~0
而不是
-1
),因此只需执行以下任一操作:

x >> (32+(n * ~0)) // Straightforward negate of n using substitute for -1


好吧,这有点粗俗,效率不高,但我认为这更像是一个理论实验,而不是任何人都会做的

您可以使用~0来表示-1(这将反转0的所有位,以便设置所有位。在常规处理器上,这是-1)。 所以如果你想要-n,你可以去n*(~0)


你不能用
5>>n
吗?我想在那种情况下我可以,但我正在处理一个x>>(32-n)的案例,因为他不能用
-
,但这个表达式也没有。从技术上讲,他可以使用它。给它添加一个巨大的值,然后强制溢出?是的,我意识到我的问题输入错误。实际上,我正在处理这个案例(5>>(32-n)),当我执行5 32-n==32+~n+时,我的代码会中断1@rcgldr好的,这确实有效,现在我要弄清楚它为什么有效。@user3483844-要对一个数字求反,取其补码并加上1。好吧,他被告知
~0
-1
的合法替代品,所以很明显,这个作业假设两个是互补的。~n基本上不是-(n+1)@GRC:我不明白你想说什么。。。如果你想知道最后一个例子,我在常数中加入了
+1
33+~n
32+(~n+1)
相同。你是对的,我在睡觉前回答了这个问题。:)
x >> (33 + ~n)  // Direct use of two's complement to get -n, since -n == (~n) + 1
5 >> (32 + ((~0) * n))