【问题标题】:Turning bits into values将位转换为值
【发布时间】:2011-09-17 23:54:23
【问题描述】:

计算机如何知道 (int x, y) x << y 表示移位 y 位?我不是指轮班部分。我的意思是y 部分。计算机是否将 x 移动 1 并从 y 中减去 1 直到 y == 0?如果不是,计算机如何计算出 y 的值?

如果说y = 10,那么二进制表示是0b1010。 电脑总不能简单地把1010的每一点都拿来用吧?

我正在尝试对大于 8 的位大小进行此操作。由于值不是简单地存储为标准整数数组,因此容器不代表值,因此重载运算符 <<>> 是有点难。 但是,从 100 位数字倒数到 0 效率有点低,所以我试图找到一种方法让计算机更快地理解位数组。

【问题讨论】:

  • 取决于 ALU 的内部结构。可能是一些非常丑陋、难以理解和复杂的位摆弄电路,以某种方式降低了算法的复杂性。
  • 同意这听起来像是硬件问题而不是 C++ 问题

标签: c++ math mathematical-optimization bitarray bit-shift


【解决方案1】:

首先,在 C 中,执行大于所讨论类型的位宽的移位的效果是未定义的 - 换句话说,如果您有 32 位整数,x << 33 将导致不可靠的结果(它不需要为零!)。

具体实现取决于您的硬件。一些嵌入式处理器确实会执行单位移位循环。然而,在更强大的 CPU 架构(例如 x86)上,有一条机器指令可以在单个操作中进行任意移位,通常在硬件中使用类似 barrel shifter 的东西。 C 对移位操作数值的限制来自不同的指令集以不同的方式处理超出范围的移位值; x86 将截断 shift 参数(即,如果您使用 32 位值,则取模 32),但其他一些指令集架构可能有不同的行为。

一般来说,除非您正在为嵌入式处理器进行开发,否则您无需担心单个位移会很昂贵。

【讨论】:

    【解决方案2】:

    您是说您有 2 位数组并且您正在尝试为它们创建移位运算符?最简单的方法可能是将正确的 y 转换为整数,然后将 x 中的每一位移动该数量.....否则,如果您想在其上操作 1 位有时它的效率会更低。您将查看第一位,如果为 1,则移动一次,查看第二位,如果为 1,则移动两次...我认为您 必须 将其作为一个整体来处理它是有效率的。


    假设y 不能放入整数...这只是我的想法,但让我们假设int 只有2 位,但y0b1111。然后,取前 2 位,将其转换为整数 (3) 并将 x 移动该数量。然后将y 右移 2(我们的 int 的大小),并将其转换为 int。这又是 3,你必须重复 4 次(int max + 1),总共 12。那个,+ 我们之前做的 3 意味着我们已经移动了 x 15 次,这是 @ 的值987654330@。您可以对更大的数字重复此过程。

    【讨论】:

    • 这就是问题所在。如果 y 是某个 128 位值怎么办?我知道这有点荒谬,但我的容器可以处理它。只是 128bits 不能变成一个值(无论如何都不使用我的 uint128_t 库)
    • @calccrypto:查看更新。我认为以这样的块重复操作(一次处理尽可能多的位)以利用 bdonlan 所说的这种“桶式移位”是最快的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-01
    • 1970-01-01
    • 1970-01-01
    • 2018-01-29
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多