2

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

如果说y = 10,那么二进制表示是0b1010。计算机不能简单地获取1010并使用它,可以吗?

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

4

2 回答 2

10

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

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

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

于 2011-06-19T01:00:09.057 回答
2

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


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

于 2011-06-19T00:51:08.480 回答