C-从没有循环的8位整数中获取最左置位的位置

时间:2018-10-26 13:46:47

标签: c binary bit-manipulation

我正在尝试制作一个程序,该程序打印出C中最左边的1位的位置,但是没有循环。

这是我到目前为止收集的:

#include<stdio.h>
int main() {
    unsigned int x, y;
    printf("Enter an integer: ");
    scanf("%d", &x);
    // Bit 
    x |= x >> 4;
    x |= x >> 2;
    x |= x >> 1;
    x ^= x >> 1;
    printf("\n%d", x);
    return 0;
}

这会将最左边的位打印为整数,但是我无法将其转换为最高置位的位置。

128应为8(1000 0000) 64应该是7(0100 0000)

1 个答案:

答案 0 :(得分:1)

this question的启发,此解决方案定义了无环popcnt(),应该可以解决您的问题:

#include <stdio.h>
#include <stdint.h>
#include <inttypes.h>

static inline uint32_t popcnt(uint32_t x) {
    x -= ((x >> 1) & 0x55555555);
    x = (((x >> 2) & 0x33333333) + (x & 0x33333333));
    x = (((x >> 4) + x) & 0x0f0f0f0f);
    x += (x >> 8);
    x += (x >> 16);
    return x & 0x0000003f;
}

static inline uint32_t firstset(uint32_t x) {
    x |= (x >> 1);
    x |= (x >> 2);
    x |= (x >> 4);
    x |= (x >> 8);
    x |= (x >> 16);
    return popcnt(x);
}

int main() {
    uint32_t x;

    printf("Enter an integer: ");
    scanf("%"SCNu32, &x);

    printf("%"PRIu32"\n", firstset(x));

    return 0;
}