如何在c中找到数字的第k位?

时间:2018-12-15 21:17:02

标签: c binary bit-shift data-representation

因此,我为此找到的第一个解决方案是这样做的:

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

但是我不知道这将如何工作,因为如果我有数字11100,并且我想要第二位,那么这个数字&(1 << 2)将给我100。现在,如果我执行此数字> > 2,我将得到1,这是不正确的,因为数字的第二位是0。难道每个位移位不只位移k-1吗?

2 个答案:

答案 0 :(得分:1)

我们有n号。可能是1234,即二进制的10011010010。

(1 << k)将数字1中的位左移k次。结果,我们得到的数字除第k个位置(第1个移动到第k个位置)外全为0。

&运算符按位与。因此,除第k个数字外,所有其他位置上的每个0都会使我们在原始n个数字中的数字为0。原始数字中的第k位为0-1和1&1 = 1。

不得已,将结果k-向右移动会使该位出现在数字的开头,因此我们根据第k个位置取1或0。

计算示例:

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

第4位为1。

答案 1 :(得分:0)

在这里,利用逻辑:

#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;
}