尋找「逆天」常量

2021-09-06 22:11:35 字數 3222 閱讀 4705

同事在研究lz4 壓縮演算法時候給我發來了一段**,看完了頓時表示非常震驚:

static

const

int multiplydebruijnbitposition = new

int[32];

//////

find the number of trailing zeros in 32-bit.

//////

///static

int getmultiplydebruijnbitposition(uint

v)

下面依次解釋下這段**的意思:

假設變數v=123456, 那麼其二進位制表示形式為(...)11110001001000000, -v 在計算機中的二進位制表示形式為(...)00001110111000000, 所以(v & -v) == 1000000, 十進位制表示形式為64。

(v & -v) * 0x077cb531 的意思是將常量0x077cb531 向左移位6位(左移6位相當於乘64)。

((uint)(v & -v) * 0x077cb5310) >> 27 位的意思是繼續將上一步的結果向右移位27位,因為01串總長度是32位,向右移27位以後低位只剩下5個bits。

而0x077cb5310 的二進位制表示形式為00000111011111001011010100110001, 所以上面的步驟相當於如下**:

static

int getmultiplydebruijnbitposition(uint

v)

根據上面的常量陣列,可知當v 等於123456時,其(v & -v) 的二進位制表示行為末尾含有6個0。

這個演算法的用處目前看主要有兩種:

1. 快速計算log2(v & -v);

2. 任意給定兩個32-bit 的整型陣列,對其中的資料進行異或運算,得到的值v, 採用如上演算法判斷第幾位是不同的,從而用於壓縮演算法。

以上是關於這個常量的簡要介紹,下面重點介紹下這個常量的特點:

1. 32-bit 長度;

3. 首尾是迴圈的;

根據以上3條規則,設計查詢常量值演算法**如下:

using

system;

using

system.collections.generic;

namespace

test

;

static

readonly

int debruijnlength = 5

;

static

readonly

double maxdebruijnlistcount = math.pow(2, debruijnlength) - 4

;

static

readonly

uint constone = 0x077cb531

;

static

readonly

uint consttwo = 0x0653adf1

;

static

void

init()

static

uint getconstarray(uint

constint)

return

constarray;

}static

const

int multiplydebruijnbitposition = new

int[32

] ;

//////

find the number of trailing zeros in 32-bit.

/// ///

///static

int getmultiplydebruijnbitposition(uint

v)

static

void

getdebruijnkeystr()

}static

void getdebruijnkey(string

currentkey)

else

if (debruijnlist.count >maxdebruijnlistcount)

if ((debruijnlist.contains(nextkeyflagzero) ||debruijnreservelist.contains(nextkeyflagzero))

&& (debruijnlist.contains(nextkeyflagone) ||debruijnreservelist.contains(nextkeyflagone)))

if (!debruijnlist.contains(nextkeyflagzero) && !debruijnreservelist.contains(nextkeyflagzero))

if (!debruijnlist.contains(nextkeyflagone) && !debruijnreservelist.contains(nextkeyflagone))

//no new entry was added, so just remove the parent key.

int lastindexofdebruijnlist = debruijnlist.count - 1

;

if (debruijnlist[lastindexofdebruijnlist] ==currentkey)

}static

void main(string

args)

console.readline();}}

}

最後得到的新的「逆天」常量值為0x0653adf1u, 根據常量可以得到常量陣列,演算法如下:

//

constone = 0x077cb531;

//constone = 0x0653adf1;

static

uint getconstarray(uint

constint)

return

constarray;

}

新的常量陣列如下:

static

const

int multiplydebruijnbitposition2 = new

int[32

];

逆天改命第一天

今天還是蠻有歷史意義的。為什麼呢?因為我頭一次經歷因為外力因素讓我沒法讀書了 記得9月份剛來港城的時候,我整個人充滿了朝氣。不像別的轉專業的同學,雖然放棄了7年的老本行 地質學 來到乙個新的領域 資料科學 我依舊信心滿滿 心裡沒ac數 覺得自己肯定可以學的很棒然後迎娶白富美走向人生巔峰 收!也確實,...

知乎上逆天的商品

我有乙個站是根據知乎上的購物分享做出來的,razzit 知乎上逆天的商品,除了網域名稱花費了我50大洋,其餘都是免費的,但是優化的還不好,送給女朋友的一週年紀念禮物,想著讓她自己賺點零花錢,當然了,等我工作了,即使 賺不到錢,也會給她零花錢,誰叫我愛她。我叫zz,她叫rabbit,我想讓她把我放到心...

source insight的使用方法逆天整理

為什麼要用source insight呢?因為她比完整的ide要更快啊,比一般的編輯器便捷啊!她有逆天的檢視定義,檢視呼叫,檢視引用功能以及方便的context window上下文顯示,像這樣的東西非常有利於檢視大量 那麼問題來了 比如我現在隨便找了乙份原始碼,我該要怎麼閱讀呢?很簡單,si可以極其...