как перебрать цифры двоичного числа? - PullRequest
2 голосов
/ 07 ноября 2010

У меня есть двоичное число 1011011, как я могу перебрать все эти двоичные цифры одну за другой?

Я знаю, как сделать это для десятичных целых чисел, используя модуль и деление.

Ответы [ 9 ]

5 голосов
/ 07 ноября 2010
int n = 0x5b; // 1011011

На самом деле вы должны просто сделать это, шестнадцатеричное в общем случае гораздо лучше:

printf("%x", n); // this prints "5b"

Чтобы получить его в двоичном формате, (с акцентом на простое понимание) попробуйте что-то вроде этого:

printf("%s", "0b"); // common prefix to denote that binary follows
bool leading = true; // we're processing leading zeroes
// starting with the most significant bit to the least
for (int i = sizeof(n) * CHAR_BIT - 1; i >= 0; --i) {
    int bit = (n >> i) & 1;
    leading |= bit; // if the bit is 1, we are no longer reading leading zeroes
    if (!leading)
        printf("%d", bit);
}
if (leading) // all zero, so just print 0
    printf("0");

// at this point, for n = 0x5b, we'll have printed 0b1011011
3 голосов
/ 07 ноября 2010

Расширяя ответы Фредерика и Габи, все, что вам нужно сделать, это осознать, что правила в базе 2 ничем не отличаются от базы 10 - вам просто нужно выполнить деление и модуль с делителем 2 вместо 10.

Следующим шагом будет просто использовать number >> 1 вместо number / 2 и number & 0x1 вместо number % 2 для повышения производительности.Имейте в виду, с современными оптимизирующими компиляторами, вероятно, нет никакой разницы ...

3 голосов
/ 07 ноября 2010

Вы можете использовать модуль по модулю и деление на 2 точно так же, как и в базе 10. Вы также можете использовать бинарные операторы, но если вы уже знаете, как это сделать в базе 10, было бы проще, если бы вы просто использовали деление и модуль

2 голосов
/ 07 ноября 2010

Чтобы расширить ответ @ Марко на примере:

uint value = 0x82fa9281;

for (int i = 0; i < 32; i++)
{
    bool set = (value & 0x1) != 0;
    value >>= 1;

    Console.WriteLine("Bit set: {0}", set);
}

Это проверяет последний бит, а затем сдвигает все на один бит.

2 голосов
/ 07 ноября 2010

В C, по крайней мере, вы можете сделать что-то вроде:

while (val != 0)
{
   printf("%d", val&0x1);
   val = val>>1;
}
2 голосов
/ 07 ноября 2010

Используйте AND с увеличивающейся силой в два ...

1 голос
/ 08 ноября 2010

Вы можете просто пройти через каждый бит. Следующий псевдокод типа C позволяет вам установить номер бита, который вы хотите проверить. (Вы также можете захотеть Google Endianness)

for()
{
  bitnumber = <your bit>
  printf("%d",(val & 1<<bitnumber)?1:0);
}

Код в основном записывает 1, если установленный бит, или 0, если нет. Мы сдвигаем значение 1 (которое в двоичном виде равно 1;)) количество бит, установленных в bitnumber, а затем мы И это со значением в val, чтобы увидеть, если оно совпадает. Все просто!

Итак, если bitnumber равен 3, мы просто делаем это

00000100 (например, значение 1 смещено на 3 влево)

И

10110110 (Мы проверяем это с тем, что вы цените)

=

00000100 = Правда! - Для обоих значений установлен бит 3!

1 голос
/ 07 ноября 2010
        byte input = Convert.ToByte("1011011", 2);
        BitArray arr = new BitArray(new[] { input });
        foreach (bool value in arr)
        {
            // ...
        }
1 голос
/ 07 ноября 2010

Если вы уже начинаете со строки, вы можете просто перебрать каждый из символов в строке:

var values = "1011011".Reverse().ToCharArray();
for(var index = 0; index < values.Length; index++) {
 var isSet = (Boolean)Int32.Parse(values[index]); // Boolean.Parse only works on "true"/"false", not 0/1
 // do whatever
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...