回答
你這裏有多個答案:http://graphics.stanford.edu/~seander/bithacks.html#IntegerLogObvious 最簡單的幸福,假設你有一個unsigned int v您輸入值:
unsigned int r = 0; // r will be lg(v)
while (v >>= 1) // unroll for more speed...
{
r++;
}
但它會在這個過程中改變訴
編輯:你的情況,如果你是100%肯定你的輸入和int和2的冪,查找表可能是最簡單和最快的
Endianess與它有什麼關係? – Skizz 2012-01-04 15:23:11
我相當肯定你的代碼是正確的,沒有考慮到它所運行的硬件系統的字節順序。 – dasblinkenlight 2012-01-04 15:23:57
這是正確的。 – Jonathan 2012-01-04 15:24:52
這裏有一個版本,只做五次迭代最多爲32位值,與lezebulon的答案不同,後者的最壞情況是32次迭代。適應64位值將此版本的迭代次數增加到6次,其他次數增加到64次。
int get_pos (unsigned v)
{
int s=16,p=0,m=0xffff;
while (s)
{
if (v>>s) p += s;
v = (v | (v >> s)) & m;
s >>= 1;
m >>= s;
}
return p;
}
所有你需要做的就是循環和每次移動一點。但使用開關盒的方法更快。列出兩個爲你。
//more code but awesomely fast
int getBitOffset1(int d) {
switch(d) {
case 1: return 1;
case 2: return 2;
case 4: return 3;
case 8: return 4;
case 16: return 5;
case 32: return 6;
/* keep adding case upto sizeof int*8 */
}
}
//less code, the loop goes 64 times max
int getBitOffset2(int d) {
int seed=0x01;
int retval=0;
do{
if(seed<<retval == d) {
break;
}
retval++;
}while(retval<=sizeof(int)*8);
return retval+1;
}
int main() {
printf("%d\n", getBitOffset2(32));
printf("%d\n", getBitOffset2(1));
return 0;
}
- 1. 在SQLite3中獲取ROWID的偏移量
- 2. 在C中獲取時區GMT偏移
- 3. 獲取時區偏移量
- 4. 在C#中基於偏移量從瀏覽器中獲取TimeZone
- 5. 將偏移量定位到光標位置的Javascript偏移量
- 6. Draw2D圖與偏移獲取位置
- 7. C# - 從已知偏移量的文件中獲取字節
- 8. 從固定內存偏移量中獲取值:Visual C++編程
- 9. 在Mac上獲取系統時區的UTC偏移量(C++)
- 10. 文件中的偏移量存儲在C中的位置?
- 11. 數組偏移量和位#
- 12. 獲取文本元素的偏移量
- 13. 使用MRJob獲取字節偏移量
- 14. 獲取UsedRange的絕對偏移量
- 15. 從邊界OSMdroid獲取偏移量mrker
- 16. 獲取字符串的偏移量
- 17. 獲取日期無偏移量
- 18. 獲取Olson時區當前偏移量
- 19. 如何獲取壁紙偏移量?
- 20. 獲取特定偏移量的BsonDocument
- 21. Treetop:獲取節點的偏移量
- 22. openAL獲取/設置偏移量,以秒爲單位
- 23. jquery獲取並設置文檔偏移量(或位置?)
- 24. Python - 以秒爲單位獲取UTC偏移量
- 25. 獲取contentpresenter的位置(大小和所有者的偏移量)
- 26. 如何正確獲取DOM元素的位置偏移量?
- 27. 獲取給定位置的時區偏移量
- 28. 從OSX獲取屏幕分辨率和位置/偏移量
- 29. 獲取元素相對於父容器的位置/偏移量?
- 30. 在C中使用指針偏移量#
你的意思是兩個冪(6是不是一個)?在這種情況下,「位偏移」將是對數基2? – 2012-01-04 15:13:12
是的,請澄清。最好的問候, – 2012-01-04 15:16:31
幼稚的方法是循環和測試,但可能有一個本地CPU指令可以在一條指令中完成。 (「獲得最少(或最多)顯着位」) – 2012-01-04 15:17:50