Я думаю, что, возможно, спал в своем классе CS, когда они говорили о Позициях двоичного разряда, таким образом, я надеюсь, что кто-то может предоставить руку.
У меня есть неподписанное 32-разрядное целое число (Позволяет, используют значение: 28)
Согласно некоторой документации я перехожу, значение целого числа содержит флаги, указывающие различные вещи.
Позиции двоичного разряда во флаге пронумерованы от 1 (младший разряд) к 32 (старший разряд). Все неопределенные флаговые биты резервируются и должны быть установлены на 0.
У меня есть Таблица, которая показывает значения флагов со значением для номеров 1-10.
Я надеюсь, что кто-то может попытаться объяснить мне, что это все средство и как найти значение (значения) "флага" от числа как, 28, базирующимся прочь позиции двоичного разряда.
Спасибо
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
Предполагая, что 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;
Чтобы получить int
со значением 0
или 1
, представляющий только n
-й бит этого целого числа, используйте:
int bitN = (value >> n) & 1;
Но обычно это не то, что вы хотите делать. Более распространенная идиома такая:
int bitN = value & (1 << n);
В этом случае bitN
будет 0
, если n
-й бит не установлен, и не равен нулю в случай, когда установлен n
-й бит. (В частности, это будет любое значение, полученное только с установленным битом n
.)