質問

ジョエル記のセキュリティ確保のための設定ビットbyteとしてプログラミングの問題彼の ゲリラのご案内面接, いて次のように語っているような方法を活用パターンで発生するルックアップ。私も少し背後からのパターンです。

をまとめ:

Number of bits set in a byte in 16x16
0   1   1   2   1   2   2   3   1   2   2   3   2   3   3   4  
1   2   2   3   2   3   3   4   2   3   3   4   3   4   4   5  
1   2   2   3   2   3   3   4   2   3   3   4   3   4   4   5  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
1   2   2   3   2   3   3   4   2   3   3   4   3   4   4   5  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
3   4   4   5   4   5   5   6   4   5   5   6   5   6   6   7  
1   2   2   3   2   3   3   4   2   3   3   4   3   4   4   5  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
3   4   4   5   4   5   5   6   4   5   5   6   5   6   6   7  
2   3   3   4   3   4   4   5   3   4   4   5   4   5   5   6  
3   4   4   5   4   5   5   6   4   5   5   6   5   6   6   7  
3   4   4   5   4   5   5   6   4   5   5   6   5   6   6   7  
4   5   5   6   5   6   6   7   5   6   6   7   6   7   7   8  

最初の行列と同じものが、各位置におけるグリッドによって算出することができますの最初の値と、行列としています。このため、する必要があるのルックアップテーブル16の応募用8ビット番号、できるだけ使第16ます。そして、したい場合は、カウントのセットビットの数243,例えば、だい:

a = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
x = 243 / 16 => 15 # (int)
y = 243 % 16 => 3

a[x] + a[y] => 6

# Are there six bits set in the number 243?
243 = 11110011 # yep

次のパターンの見たときダブルサイズのNxNグリッドでは、各領域が加算したものは、0、1、1、2、各社それぞれ、このように:

# Make a 4x4 grid on the paper, and fill in the upper left quadrant with the values of the 2x2 grid.  
# For each quadrant, add the value from that same quadrant in the 2x2 grid to the array.  

# Upper left quad add 0 to each number from 2x2  
0   1   *   *  
1   2   *   *  
*   *   *   *  
*   *   *   *  

# Upper right quad add 1 to each number from 2×2  
0   1   1   2  
1   2   2   3  
*   *   *   *  
*   *   *   *  

# Lower left quad add 1 to each number from 2×2  
0   1   1   2  
1   2   2   3  
1   2   *   *  
2   3   *   *  

# Lower right quad add 2 to each number from 2×2  
0   1   1   2  
1   2   2   3  
1   2   2   3  
2   3   3   4  

このプロセスを繰り返し二回としておりません16x16グリッド上から、きっかけになるかもしれないとできることはあるとうquadtreeアルゴリズムができ始めからグリッド:

0 1
1 2

された複数Nをルックアップテーブルのフライ、ビット数.なので私の質問/チャレンジで き出のためのアルゴリズムをいっぱいで仕分けもバッチリです。

役に立ちましたか?

解決 2

に基づくロバート-コード こちらの, でも可能なのはヤング率を置き換えて一つのシフトや、このように:

a = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
x = 243 >> 4 # 15 (same as dividing by 16)
y = 243 & 0x0f # 3 ( same as modding by 16)

result = a[x] + a[y] # 6 bits set 

またはC:

const unsigned char oneBits[] = {0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4};

unsigned char CountOnes(unsigned char x)
{
    unsigned char results;
    results = oneBits[x&0x0f];
    results += oneBits[x>>4];
    return results
}

のための任意のサイズの整数だけなのにループを通じて、バイト、クルックアップのような:

def bits(n)
    a = [0,1,1,2,1,2,2,3,1,2,2,3,2,3,3,4]
    a[n >> 4] + a[n & 0x0f]
end

def setBits(n)
   total = 0
   while(n > 0)
       total += bits(n&0xff)
       n >>= 8
   end
   total
end

setBits(6432132132165432132132165436265465465653213213265465) # 78 bits set

満足しているこの答えになります。かの複雑quadtree的な効率になったのではとも思います。

他のヒント

これは愚問題です!最初の例ではまだ計算のビット数の設定を16入のではなく、256んな魔法の!全てんがカウントのビット数で設定のビットのバイト(第nibble)そのnibble、の二つを一つにした。x/16のnibble、x%16のnibble.

を繰り返します、しかし、これらのルックアップテーブルのための二つのビットは、あなただけで、一度ごと対になっています。極限したりすることも可能ですのすべてのビットと一つ一つを明らかな答えです。

全体のポイントルックアップテーブルを回避することである。

恐れ入り後、かすることができます。私$.02(力)

Private Sub Button1_Click(ByVal sender As System.Object, _
                          ByVal e As System.EventArgs) Handles Button1.Click

    For x As Integer = 0 To 255
        Debug.WriteLine(bitsOn2(CByte(x)) & " " & Convert.ToString(x, 2).PadLeft(8, "0"c))
    Next

End Sub

Private Function bitsOn(ByVal aByte As Byte) As Integer
    Dim aBit As Byte = 1
    For z As Integer = 0 To 7
        If (aByte >> z And aBit) = aBit Then bitsOn += 1
    Next
End Function

Dim aDict As New Dictionary(Of Integer, Integer)
Private Function bitsOn2(ByVal aByte As Byte) As Integer
    If aDict.Count = 0 Then 'init dictionary
        For x As Integer = 0 To 255
            aDict.Add(x, bitsOn(CByte(x)))
        Next
    End If
    Return aDict(aByte)
End Function
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top