计算机如何知道(int x,y)x << y
意味着转移y位?我不是指转变部分。我的意思是y
部分。计算机是否将x移位1并从y中减去1直到y == 0?如果不是,计算机如何计算y的值?
如果说y = 10
,则二进制表示为0b1010
。
计算机不能简单地取1010
的每一位并使用它,可以吗?
我正在尝试使用大于8的位大小。因为这些值不是简单地存储为标准整数的数组,所以容器不代表值,因此重载了运算符<<
和{{ 1}}有点困难。
但是,从100位数字倒数到0有点效率低,所以我试图找到一种方法让计算机更快地理解位数。
答案 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位,但是y
是0b1111
。然后,取前2位,将其转换为整数(3)并将x
移位。然后将y
右移2(我们的int的大小),并将其转换为int。这再次成为3,你必须重复4次(int max + 1)总共12次。那,+我们之前做的3意味着我们已经转移了x
15次这是值y
。你可以为更大的数字重复这个过程。