【问题标题】:Fastest way to calculate an X-bit bitmask?计算 X 位位掩码的最快方法是什么?
【发布时间】:2011-02-09 12:03:06
【问题描述】:

我尝试解决这个问题已经有一段时间了,但不能仅使用整数算术和位运算符。但是,我认为这是可能的,而且应该相当容易。我错过了什么?

问题:获取任意长度的整数值(这与问题无关),它的 X 最低有效位设置为 1,其余为 0。例如,给定数字 31,我需要得到一个等于 0x7FFFFFFF 的整数值(31 个最低有效位为 1,其余为 0)。

当然,使用循环或将移位的 1 转换为整数 X 次就可以了。但这不是我正在寻找的解决方案。它应该更靠近(X << Y - 1),因此不使用循环。

【问题讨论】:

    标签: c# algorithm integer bit-manipulation math


    【解决方案1】:

    试试这个:(1

    【讨论】:

    • 它不应该,只要你先将 1 转换为 uint (不懂 C#,所以不知道如何)。然后它将被评估为 0 - 1,即 32 位机器上的 32 个 1。
    • 您有我正在寻找的解决方案。简单明了,没有任何循环。当 X 等于整数的位长时,所有位都按预期变为 1。它甚至适用于 X = 0 的极端情况。谢谢。
    【解决方案2】:

    试试这个:

    uint.MaxValue >> (32 - something)
    

    【讨论】:

      【解决方案3】:

      我认为以下应该可行:

      int mask = (int)Math.Pow(2, 31) - 1;
      

      这是一个单一的数学表达式,但并不是特别有效,因为以这种方式计算功率并不是一个好主意。然而,由于我们计算的是 2 的幂,我们可以使用 shift 来做同样的事情:

      int mask = (1 << 31) - 1;
      

      【讨论】:

      • 涉及浮点数和转换为int 可能不符合“最快”的条件......
      • 是的,我在发布初始版本后就意识到如何纠正这个问题,但与此同时,@doublep 已经发布了该解决方案。我想我会把我的版本留在这里,因为它解释了让我到达那里的思考过程:-)。
      猜你喜欢
      • 2011-05-11
      • 2012-08-23
      • 1970-01-01
      • 2012-05-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多