C ++, как узнать, заканчивается ли число каким-то битовым шаблоном - PullRequest
4 голосов
/ 01 апреля 2011

Я хочу знать, заканчивается ли число некоторыми заранее заданными битовыми комбинациями.

например, я хочу знать, заканчивается ли число N буквой B

, где N - любое число, а B - также любое число

, например,

if N = 01011100 
  B = 100 then this C++ function should return 1 here in this case 1

if N = 01011100
  B = 101 then this function should return 0

:)

Ответы [ 4 ]

3 голосов
/ 01 апреля 2011

Для первого случая:

unsigned n = 0x5C;
unsigned m = 0x7; // "mask"
unsigned b = 0x4;
if ((n & m)==b) {
  ...do something...
}

Вот как это работает:

01011100  n
00000111  m
00000100  n & m  (bitand operator)
00000100  b
1 голос
/ 01 апреля 2011

Если вы знаете количество бит в B, то вам нужно построить шаблон с таким количеством битов, равным 1. Предположим, что int имеет 32 бита в вашей системе:

unsigned int mask = 0xFFFFFFFF >> (32 - numberOfBitsInB);
if (N & mask == B)
    printf("%d ends with %d\n", N, B);
else
  printf("Nope");

Вы также можете вычислить числобитов в B через:

int tmpB = B;
int numberOfBitsInB = 0;
while (tmpB)
{
    numberOfBitsInB++;
    tmpB >>= 1;
}
0 голосов
/ 01 апреля 2011

Возможно создать маску для любой битовой комбинации длины. Вот пример C Это избавит вас от необходимости жестко задавать код 0x7, если вы хотите проверить соответствие более чем 3 битам.

bool bitPattern(int N, int B)
{
    int shift = 0;
    int mask = 0x0;
    while(B >> shift++ > 0) mask |= 0x01 << shift-1;
    return  (N & mask) == B;
}

int main(int argc, char *argv[]) {

    printf("01011100 ends with 100 ? %s\n", bitPattern(0x5C, 0x04) ? "Yes" : "No");
    printf("01011100 ends with 101 ? %s\n", bitPattern(0x5C, 0x05) ? "Yes" : "No");
}
0 голосов
/ 01 апреля 2011
unsigned int mask = ~0 >> (sizeof(unsigned int) * 8 - num_bits_in_B);

if (N & Bitmask == B)
  printf("%d ends with %d\n", N, B);
else
  printf("Nope");

Используйте метод, предложенный @Benoit выше, чтобы вычислить количество бит в B.

...