我有一個64位的數字(但僅使用42個低位),需要計算機的位的總和在n
,n+m
,n+m*2
和n+m*3
(注:任何可以產生一個和值> 4是無效的),用於一些固定的米和放置在數如何獲得校驗爲跨入模式
如使用m=3
一個例子的所有位和給出的16位數字
0010 1011 0110 0001
n個的每一個值
我需要計算
2, 3, 1, 2, 3, 0, 3
有沒有人有任何(酷)想法的方式來做到這一點?我很好,有點混蛋。
我現在的想法是:把位移位輸入的副本對準總和的值,然後建立一個邏輯樹做4倍1位加法器。
v1 = In;
v2 = In<<3;
v3 = In<<6;
v4 = In<<9;
a1 = v1^v2;
a2 = v1 & v2;
b1 = v3^v4;
b2 = v3 & v4;
c2 = a1 & b1;
d2 = a2^b2;
o1 = a1^b1;
o2 = c2^d2;
o4 = a2 & b2;
這確實會導致結果分散在3個不同的整數,但很好。
編輯:因爲它發生了,我需要資金的直方圖這樣做的,o2&o1
,o2
和o1
bit-count給我我想要的。
的第二解決方案使用一個完美的哈希函數
arr = [0, 1, 1, 2, 1, 2, 2, 3, 1, 2, 2, 3, 2, 3, 3, 4];
for(int i = 0; i < N; i++)
{
out[i] = arr[(In & 0b1001001001) % 30];
In >>= 1;
}
這通過注意到4中選擇位只能採取16種模式和(由猜測並檢查)它們可被散列使用mod 30將其轉換爲0-15。從那裏,一個計算值表格給出了所需的總和。因爲它只發生在4個步驟中的3個我需要這樣工作。
p.s.
正確的勝負很快。快速勝過清楚。我希望能夠運行數百萬次。
你的代碼是不是很通用的,因爲「V *」的數量將與你的米不等。此外,你必須重複每個[0; m]這個方法來獲得完整的結果向量。 – 2009-02-28 19:43:38
我事先知道什麼是跨步的,我只有幾個價值,我需要與之合作。我可以概括這些代碼,但它不太清楚。 – BCS 2009-02-28 19:56:05
我無法理解您的代碼。你可以用16位示例的幾次迭代來進行手動計算嗎?謝謝。 – strager 2009-03-01 05:20:32