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 つのアドレスは同じです。
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 つのアドレスは同じです。
@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);
}
N
どうやら、最下位ビットを比較したいようです。その場合、あなたN
はマスクではありません。「マスク」は、非常に具体的な意味を持つ確立された用語です。あなたN
はマスクではありません。比較する必要があるのは単なるビット数です。
これを実現するには、実際に から実際のマスクを生成することから始めることができますN
。これ
uintptr_t mask = 1;
mask = (mask << N) - 1;
最下位バイナリ位置に1
sを持つマスクを作成します。N
(アドレスを保存するためにどのタイプを使用するかはわかりません。それは、 の代わりに使用する必要があるタイプですuintptr_t
。)
次に、そのマスクを使用してアドレスを比較できます
(address1 & mask) == (address2 & mask)
また
((address1 ^ address2) & mask) == 0
または、マスクをまったく使用せずに同じ問題を解決することもできます。アドレスM
のビット数が合計の場合、比較は次のように表すことができます。
(address1 << (M - N)) == (address2 << (M - N))
数字の 4 (または 00100) を必要なマスクに変えるには、
#define MASK(n) ((1 << (n)) - 1)
また、整数のバイナリ表現を引用する場合、C では 0b100 を使用しますが、4 を意味することがわかります。00100 は 8 進定数です。