Как найти k-й бит числа в c? - PullRequest
0 голосов
/ 16 декабря 2018

Итак, первое решение, которое я нашел для этого, говорит:

(n & ( 1 << k )) >> k

Но я не понимаю, как это будет работать, потому что, если у меня есть номер 11100, и я хочу второй бит,это число & (1 << 2) даст мне 100. Теперь, если я сделаю это число >> 2, я получу 1, что неверно, так как 2-й бит числа равен 0. Не должен каждый бит сдвигатьсятолько смена к-1?

Ответы [ 2 ]

0 голосов
/ 16 декабря 2018

У нас есть номер n.Пусть это будет 1234, который в двоичном виде равен 10011010010.

(1 << k) сдвигает биты числа 1. k раз влево.В результате мы получили число, в котором есть все 0, кроме k-й позиции, куда перемещается наш 1. Оператор

& является побитовым AND.Таким образом, каждый 0 будет равен 0 в нашем исходном n числе на всех позициях, кроме k-й.Будет этот k-й бит из исходного числа в виде 0 & 1 = 0, а 1 & 1 = 1.

В крайнем случае, сдвиг этого результата k - раз вправо заставляет этот самый бит появляться в начале числа,поэтому у нас есть 1 или 0 в зависимости от того, что было на k-й позиции.

Пример вычислений:

(10011010010 & ( 1 << 4)) >> 4
(10011010010 & 00000010000) >> 4
00000010000 >> 4
00000000001

Итак, 4-й бит равен 1.

0 голосов
/ 16 декабря 2018

Вот, пожалуйста, используя логику:

#include <stdio.h>

unsigned get_bit(unsigned k, int number) {
    return ((unsigned)number & (1U << k)) > 0;
}

int main(){

    printf("b00001010 and k = 0, result = %u\n", get_bit(0, 0xA));
    printf("b00001010 and k = 0, result = %u\n", get_bit(1, 0xA));
    printf("b00001010 and k = 0, result = %u\n", get_bit(2, 0xA));
    printf("b00001010 and k = 0, result = %u\n", get_bit(3, 0xA));
    printf("b00001010 and k = 0, result = %u\n", get_bit(4, 0xA));

    return 0;
}
...