这里有一些方法。首先,一些变体“设置n
位,然后移动from
”。我会用C#来回答,但我比C更熟悉它。应该很容易转换。
uint nbits = 0xFFFFFFFFu >> -(to - from);
return nbits << from;
缺点:不能处理一个空的范围,即,在情况下to <= from
。
uint nbits = ~(0xFFFFFFFFu << (to - from));
return nbits << from;
上行:可以处理其中to = from
在这种情况下,将设置无位的情况下。
下行:无法处理全部范围,即设置所有位。
这应该是显而易见的。
或者,您可以使用“减两两个权”招,
(1u << to) - (1u << from)
缺点:to
不能32,所以你永远无法设定最高位。
是这样工作的:
01000000
^^^^^^ "to" zeroes
100
^^ "from zeroes"
-------- -
00111100
到1的右侧的“从”的一部分,它只是从零零被减去。然后在“从”部分1,你要么从减去1(如果to == from
),并得到0的结果,否则你会从0在to
减去1,并借一路1部分,这将被重置。
已经提出在写作的时候所有真正的逐位的方法有那些缺点之一,这提出了一个问题:能不能没有缺点呢?
答案是,很不幸,令人失望。它可以在没有缺点来完成,但只能通过
- 作弊(即使用非按位元素),或
- 超过操作将是很好的,或
- 不规范操作
举的1个例子,你可以随便挑任何以前的方法,并添加一个特殊的情况下(与if
或三元运算符),以解决他们的缺点。
为了给出的2个例子:(未测试)
uint uppermask = (((uint)to >> 5)^1) << to;
return uppermask - (1u << from);
的uppermask
要么取1和移位它由to
左(照常),或者它需要一个0,并转移它留下(由如果to == 32
,这个数量无关紧要,因为它正在被移位)。但它有点奇怪,并使用更多的操作。
为了给出为3的示例中,给予零当由操作数大小或多个换档的换档将解决这个非常容易。不幸的是,这种转变并不常见。
检查这[post](http://stackoverflow.com/questions/47981/how-do-you-set-clear-and-toggle-a-single-bit-in-cc)并适应它在一个循环中 – Coconop
为什么你不尝试实现它,看看你能想出什么。 –
这似乎可能是家庭作业..无论如何,这是一个想法。设置'n'位,然后通过'from'移动它们。 – harold