亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

設置的最小有效位的位置

設置的最小有效位的位置

C++
月關寶盒 2019-07-01 20:33:50
設置的最小有效位的位置我正在尋找一種有效的方法來確定在整數中設置的最小有效位的位置,例如對于0x0FF0,它將是4。一個簡單的實現是:unsigned GetLowestBitPos(unsigned value){    assert(value != 0); // handled separately    unsigned pos = 0;    while (!(value & 1))    {       value >>= 1;       ++pos;    }    return pos;}有什么辦法能擠出一些循環嗎?(注意:這個問題是給喜歡這類事情的人,而不是為了讓人們告訴我木偶優化是邪惡的。)
查看完整描述

3 回答

?
千萬里不及你

TA貢獻1784條經驗 獲得超9個贊

旋轉鉆頭提供了一個優秀的集合,呃,比特旋轉黑客,并附上性能/優化討論。對于您的問題,我最喜歡的解決方案(來自該站點)是“乘和查找”:

unsigned int v;  // find the number of trailing zeros in 32-bit v int r;           // result goes herestatic const int MultiplyDeBruijnBitPosition[32] = {
  0, 1, 28, 2, 29, 14, 24, 3, 30, 22, 20, 15, 25, 17, 4, 8, 
  31, 27, 13, 23, 21, 19, 16, 7, 26, 12, 18, 6, 11, 5, 10, 9};r = MultiplyDeBruijnBitPosition[((uint32_t)((v & -v) * 0x077CB531U)) >> 27];

有用的參考資料:


查看完整回答
反對 回復 2019-07-01
?
梵蒂岡之花

TA貢獻1900條經驗 獲得超5個贊

為什么不使用內置的FFS?(我從Linux上抓取了一個手冊頁,但它比這更廣泛。)

FFS(3)-Linux手冊頁

名字,姓名

FFS-查找一個單詞中的第一個位

簡介

#include <strings.h>int ffs(int i);#define _GNU_SOURCE#include <string.h>int ffsl(long int i);int ffsll(long long int i);

描述

函數返回在字I中設置的第一個(最不重要的)位的位置。最不重要的位是位置1和最重要的位置,例如32或64。函數ffsll()和ffsl()做同樣的工作,但使用可能不同大小的參數。

返回值

這些函數返回第一個位集的位置,如果i中沒有設置位,則返回0。

符合

4.3BSD,POSIX.1-2001。

注記

BSD系統有一個原型<string.h>.


查看完整回答
反對 回復 2019-07-01
?
拉丁的傳說

TA貢獻1789條經驗 獲得超8個贊

有x86程序集指令(bsf)那就行了。*)

更優化?!

邊注:

這個級別的優化本質上是依賴于體系結構的。今天的處理器是太復雜(在分支預測、緩存丟失、流水線方面),很難預測哪段代碼在哪種體系結構上執行得更快。將操作從32減少到9或類似的事情甚至會降低某些體系結構的性能。單個體系結構上的優化代碼可能會導致另一個體系結構中更糟的代碼。我認為您可以為特定的CPU優化它,或者保留它的原樣,讓編譯器來選擇它認為更好的。


查看完整回答
反對 回復 2019-07-01
  • 3 回答
  • 0 關注
  • 528 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號