我想构造二进制字符串10101010101010101010101010101010(即16 1和16 0)表示的无符号整数(4个字节)。
是否有一种使用位操作构造此值的有效方法?我可以在for循环中完成它,但我觉得效率很低。
任何语言都适合我。我个人认识c和C ++。
答案 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} }}