有没有一种有效的方法来构建b10101010101010101010101010101010?

时间:2013-06-08 18:42:11

标签: bit-manipulation

我想构造二进制字符串10101010101010101010101010101010(即16 1和16 0)表示的无符号整数(4个字节)。

是否有一种使用位操作构造此值的有效方法?我可以在for循环中完成它,但我觉得效率很低。

任何语言都适合我。我个人认识c和C ++。

2 个答案:

答案 0 :(得分:5)

只需读取第4位,然后将其视为十六进制:

你的号码只是0xAAAAAAAA。

答案 1 :(得分:1)

使用固定的位数,这有点明显......

但是对于可变数量的位,可以通过整数除法获得这种模式,如此处所示http://smallissimo.blogspot.fr/2011/07/revisiting-sieve-of-erathostenes.html

编辑以下更详细的解释:

这个想法是:

2r01 * 2r11 -> 2r11
2r0101 * 2r11 -> 2r1111
2r010101 * 2r11 -> 2r111111

相反,我们可以应用精确的除法:

2r111111 / 2r11 -> 2r010101

如果我们想要2r101010而不是2r010101,只需再添加1位(但是除法是不精确的,我假设商是由@给出的,就像在Smalltalk中一样):

2r1111111 // 2r11 -> 2r101010

2r1111111可以轻松构建,它是2减1的幂2^7-1,也可以通过bith shift (1<<7)-1获得。

在你的情况下,你的常量是((1<<33)-1)//3,或者如果你用C / C ++ ((1ULL<<33)-1)/3写它(在Smalltalk中我们不关心整数长度,它们是任意的长度,但在大多数语言中,我们必须确保操作数适合本机整数长度。)

请注意,除法也适用于长度较长的位模式,如2r100100100,除以2r111,对于长度为p的位模式,除以2^p-1即{{1} }}