C# 使用位移位除以2的幂

C# 使用位移位除以2的幂,c#,bit-manipulation,C#,Bit Manipulation,我有以下任务: 计算x/(2^n),对于0,请密切注意舍入行为 /(整数除法)总是向零舍入 位移位做什么 你如何补偿这种差异 负数在二进制表示法中是一次过的,因为负数的2是补码表示法。也许阅读相关内容会有所帮助。public int DivideByPowerOf2(intx,intn) public int DivideByPowerOf2(int x, int n) { return (x + ((x >> 31) & ((1 <<

我有以下任务:


计算
x/(2^n)
,对于
0,请密切注意舍入行为

  • /
    (整数除法)总是向零舍入
  • 位移位做什么
  • 你如何补偿这种差异

负数在二进制表示法中是一次过的,因为负数的2是补码表示法。也许阅读相关内容会有所帮助。

public int DivideByPowerOf2(intx,intn)
public int DivideByPowerOf2(int x, int n)
    {

        return (x + ((x >> 31) & ((1 << n) + ~0))) >> n;
    }
{ 返回(x+((x>>31)和(1>n; }
在我自己寻找了一个好的答案之后,我偶然发现了这一点,并且能够得到一个有效的片段。让我帮助向将来可能会发现这一点的其他人解释一下

(x + ((x >> 31) & ((1 << n) + ~0))) >> n
这就允许我们进一步对整数进行运算,以确定一些性质。首先我们需要找到2的幂,我们将除以(在本例中为n),然后将二进制移到该位置,然后减去1。例如,让我们使用3或8的幂

(000001 << 3) -1
000111
现在假设x是奇数或偶数(分别是情况1和情况2),我们可以将x加上,得到一个2的完美幂(如果我们除以2的幂,我们会得到一个正确的答案)。下面是几个例子,分别是x=8,10,-8,-12

001000 + 000000 = 001000
001010 + 000000 = 001010
now for the negatives that plague you
111000 + 000111 = 111111
110100 + 000111 = 111011
最后一步是把这些数字除以n的幂,除以8等于3,如上所述

001000 >> 3 = 000001 or 1 in decimal (8/8 = 1)
001010 >> 3 = 000001 or 1 in decimal (10/8 = 1 because of truncation)
111111 >> 3 = 111111 or -1 in decimal (-8/8 = -1)
111011 >> 3 = 111111 or -1 in decimal (-12/8 = -1 because of truncation)

好了。你的第一个任务是找出它是负数还是正数,然后从负数中得到与你的2-1次方相对应的位。把它加到你的x中,得到你在二进制中的2可除数的次方。最后将你的2次方右移。

闻起来像是家庭作业……你会有兴趣注意到这一点33>>4=2。那么,问题是,
>
运算符对负数做了什么?@Joey也许是。他不是要求我们为他做作业-他是在问我们为什么他的函数没有达到他预期的效果。提示:符号位是哪一位,当你移位时它会发生什么情况?@glow:问题仍然很糟糕。更改为不过现在。
(000001 << 3) -1
000111
111111 & 000111 = 000111 (case 1)
000000 & 000111 = 000000 (case 2)
001000 + 000000 = 001000
001010 + 000000 = 001010
now for the negatives that plague you
111000 + 000111 = 111111
110100 + 000111 = 111011
001000 >> 3 = 000001 or 1 in decimal (8/8 = 1)
001010 >> 3 = 000001 or 1 in decimal (10/8 = 1 because of truncation)
111111 >> 3 = 111111 or -1 in decimal (-8/8 = -1)
111011 >> 3 = 111111 or -1 in decimal (-12/8 = -1 because of truncation)