這裏有一些方法。首先,一些變體「設置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