我正在尝试制作一个程序,该程序打印出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)
答案 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;
}