Нахождение Позиций двоичного разряда в неподписанном 32-разрядном целом числе

Я думаю, что, возможно, спал в своем классе CS, когда они говорили о Позициях двоичного разряда, таким образом, я надеюсь, что кто-то может предоставить руку.

У меня есть неподписанное 32-разрядное целое число (Позволяет, используют значение: 28)

Согласно некоторой документации я перехожу, значение целого числа содержит флаги, указывающие различные вещи.

Позиции двоичного разряда во флаге пронумерованы от 1 (младший разряд) к 32 (старший разряд). Все неопределенные флаговые биты резервируются и должны быть установлены на 0.

У меня есть Таблица, которая показывает значения флагов со значением для номеров 1-10.

Я надеюсь, что кто-то может попытаться объяснить мне, что это все средство и как найти значение (значения) "флага" от числа как, 28, базирующимся прочь позиции двоичного разряда.

Спасибо

8
задан Evan Carslake 24 February 2015 в 04:36
поделиться

3 ответа

28 преобразуется в 11100 в двоичном формате. Это означает, что биты 1 и 2 не установлены, а биты 3, 4 и 5 установлены.

Несколько моментов: во-первых, любой, кто действительно привык к C, обычно начинает нумерацию с 0, а не с 1. Во-вторых, вы можете проверить отдельные флаги с помощью побитового оператора и ( & ), как в:

#define flag1 1    //  1 = 00 0001
#define flag2 2    //  2 = 00 0010
#define flag3 4    //  4 = 00 0100
#define flag4 8    //  8 = 00 1000
#define flag5 16   // 16 = 01 0000
#define flag6 32   // 32 = 10 0000

if (myvalue & flag1)
    // flag1 was set

if (myvalue & flag4)
    // flag4 was set

и так далее. Вы также можете проверить, какие биты установлены в цикле:

#include <stdio.h>

int main() { 
    int myvalue = 28;
    int i, iter;

    for (i=1, iter=1; i<256; i<<=1, iter++)
        if (myvalue & i)
            printf("Flag: %d set\n", iter);
    return 0;
}

должен напечатать:

Flag: 3 set
Flag: 4 set
Flag: 5 set
12
ответ дан 5 December 2019 в 06:52
поделиться

Предполагая, что flags беззнаковый ...

int flag_num = 1;
while (flags != 0)
{
    if ((flags&1) != 0)
    {
        printf("Flag %d set\n", flags);
    }
    flags >>= 1;
    flag_num += 1;
}

Если flags подписан, вы должны заменить

flags >>= 1;

на

flags = (flags >> 1) & 0x7fffffff;
0
ответ дан 5 December 2019 в 06:52
поделиться

Чтобы получить int со значением 0 или 1 , представляющий только n -й бит этого целого числа, используйте:

int bitN = (value >> n) & 1;

Но обычно это не то, что вы хотите делать. Более распространенная идиома такая:

int bitN = value & (1 << n);

В этом случае bitN будет 0 , если n -й бит не установлен, и не равен нулю в случай, когда установлен n -й бит. (В частности, это будет любое значение, полученное только с установленным битом n .)

3
ответ дан 5 December 2019 в 06:52
поделиться
Другие вопросы по тегам:

Похожие вопросы: