2011-06-19 58 views
2

计算机如何知道(int x,y)x << y意味着移位y位?我不是说转移的一部分。我的意思是y部分。计算机是否将x移动x,然后从y中减去y直到y == 0?如果不是计算机如何计算y的价值?将位转换为值

如果说y = 10,那么二进制表示是0b1010。 电脑不能简单地采取1010和使用它的每一位,可以吗?

我试图以此为位尺寸大于8大。由于值不只是作为标准整数数组存储容器不表示一个值,因此过载运营商<<>>是有点困难。 但是,从100位数倒数到0的效率有点低,所以我试图找到一种让计算机更快地理解位数组的方法。

+3

取决于ALU的内部。可能存在一些非常难看,难以理解且复杂的位摆动电路,它们以某种方式减少了算法的复杂性。 – delnan

+0

同意这听起来像一个硬件问题,而不是C++问题 –

回答

2

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


假设y无法适从一个整数......而这仅仅是从我的头顶,但让我们假设一个int只有2位,但y0b1111。然后,取前2位,将其转换为整数(3)并按该量移动x。然后右移y 2(我们的int的大小),并将其转换为int。这再次得到3,你必须重复4次(int max + 1),总共为12次。+我们之前做的3意味着我们已经移动了x 15次,这是y的值。您可以为更大的数字重复此过程。

+0

这就是问题所在。如果y是一些128位的值,那该怎么办?我知道这有点荒谬,但我的容器可以处理它。它只是128位不能使用的值(无论如何都不使用我的uint128_t库) – calccrypto

+1

@calccrypto:请参阅更新。我认为最快可以像这样重复块操作(尽可能地处理尽可能多的位),以利用bdonlan正在谈论的这种“桶式转移”。 – mpen

10

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

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

一般来说,除非您正在为嵌入式处理器开发,否则您不必担心单个位移是昂贵的。