同事在研究lz4 壓縮演算法時候給我發來了一段**,看完了頓時表示非常震驚:
staticconst
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, 所以上面的步驟相當於如下**:
staticint getmultiplydebruijnbitposition(uint
v)
根據上面的常量陣列,可知當v 等於123456時,其(v & -v) 的二進位制表示行為末尾含有6個0。
這個演算法的用處目前看主要有兩種:
1. 快速計算log2(v & -v);
2. 任意給定兩個32-bit 的整型陣列,對其中的資料進行異或運算,得到的值v, 採用如上演算法判斷第幾位是不同的,從而用於壓縮演算法。
以上是關於這個常量的簡要介紹,下面重點介紹下這個常量的特點:
1. 32-bit 長度;
3. 首尾是迴圈的;
根據以上3條規則,設計查詢常量值演算法**如下:
usingsystem;
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;
}
新的常量陣列如下:
staticconst
int multiplydebruijnbitposition2 = new
int[32
];
逆天改命第一天
今天還是蠻有歷史意義的。為什麼呢?因為我頭一次經歷因為外力因素讓我沒法讀書了 記得9月份剛來港城的時候,我整個人充滿了朝氣。不像別的轉專業的同學,雖然放棄了7年的老本行 地質學 來到乙個新的領域 資料科學 我依舊信心滿滿 心裡沒ac數 覺得自己肯定可以學的很棒然後迎娶白富美走向人生巔峰 收!也確實,...
知乎上逆天的商品
我有乙個站是根據知乎上的購物分享做出來的,razzit 知乎上逆天的商品,除了網域名稱花費了我50大洋,其餘都是免費的,但是優化的還不好,送給女朋友的一週年紀念禮物,想著讓她自己賺點零花錢,當然了,等我工作了,即使 賺不到錢,也會給她零花錢,誰叫我愛她。我叫zz,她叫rabbit,我想讓她把我放到心...
source insight的使用方法逆天整理
為什麼要用source insight呢?因為她比完整的ide要更快啊,比一般的編輯器便捷啊!她有逆天的檢視定義,檢視呼叫,檢視引用功能以及方便的context window上下文顯示,像這樣的東西非常有利於檢視大量 那麼問題來了 比如我現在隨便找了乙份原始碼,我該要怎麼閱讀呢?很簡單,si可以極其...