将位转换为值

时间:2011-06-19 00:45:50

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

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

如果说y = 10,则二进制表示为0b1010。 计算机不能简单地取1010的每一位并使用它,可以吗?

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

2 个答案:

答案 0 :(得分:10)

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

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

一般情况下,除非您正在开发嵌入式处理器,否则您无需担心单个位移是昂贵的。

答案 1 :(得分:2)

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


假设y不能适合整数...而这只是我的头脑,但我们假设int只有2位,但是y0b1111。然后,取前2位,将其转换为整数(3)并将x移位。然后将y右移2(我们的int的大小),并将其转换为int。这再次成为3,你必须重复4次(int max + 1)总共12次。那,+我们之前做的3意味着我们已经转移了x 15次这是值y。你可以为更大的数字重复这个过程。