-1

1 つのアドレスの「長さ」最下位ビットは、別のアドレスの「長さ」最下位ビットと比較されます。同じものに最適な最適なソリューションを得るのを手伝ってくれる人はいますか?

例:

address1 = 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 0 1 0 0 1
address2 = 0 0 0 0 0 0 0 0 0 0 1 0 1 0 1 0 0 0 0 1 1 0 0 1

比較ビットが 00100 の場合、上記の 2 つのアドレスは同じです。

4

3 に答える 3

2

@AndreyTが書いたように、あなたは本当にマスクを説明していません。

あなたが本当に何を意味しているのかを推測しようとすると、ここに私の最善の試みがあります:
(int-sizeが32ビットであると仮定します.sizeof()に変換するか、必要に応じて64を使用できます)
(テストされていませんが、十分にコメントされているので、テストできます自分で直してください)

void Compare(int addrA, int addrB, int nBits)
{
    // This is all 1s in binary.
    unsigned int mask = 0xFFFFFFFF;  

    mask = mask >> (32-nBits);
    // Example: if nBits = 4
    // then 32-4 = 28 and 
    // Mask == [1111] >> 28 == 28-zeros... followed by 4 Ones

    if ((addrA & mask) == (addrB & mask))
    {
        printf("Same\n");
    } else
    {
        printf("Not the same\n");
    }
}

サンプルコール

int main(void)
{
   int address1 = 0x2A09;  // 00000000 0010 1010 0000 1001
   int address2 = 0x2A19;  // 00000000 0010 1010 0001 1001

   Compare(address1, address2, 4);
}
于 2013-11-12T18:02:23.620 に答える
2

Nどうやら、最下位ビットを比較したいようです。その場合、あなたNはマスクではありません。「マスク」は、非常に具体的な意味を持つ確立された用語です。あなたNはマスクではありません。比較する必要があるのは単なるビット数です。

これを実現するには、実際に から実際のマスクを生成することから始めることができますN。これ

uintptr_t mask = 1;
mask = (mask << N) - 1;

最下位バイナリ位置に1sを持つマスクを作成します。N(アドレスを保存するためにどのタイプを使用するかはわかりません。それは、 の代わりに使用する必要があるタイプですuintptr_t。)

次に、そのマスクを使用してアドレスを比較できます

(address1 & mask) == (address2 & mask)

また

((address1 ^ address2) & mask) == 0

または、マスクをまったく使用せずに同じ問題を解決することもできます。アドレスMのビット数が合計の場合、比較は次のように表すことができます。

(address1 << (M - N)) == (address2 << (M - N))
于 2013-11-12T19:34:34.433 に答える
0

数字の 4 (または 00100) を必要なマスクに変えるには、

#define MASK(n)     ((1 << (n)) - 1)

また、整数のバイナリ表現を引用する場合、C では 0b100 を使用しますが、4 を意味することがわかります。00100 は 8 進定数です。

于 2013-11-12T19:36:19.470 に答える