C - Получить позицию крайнего левого установленного бита из 8-битного целого числа без циклов - PullRequest
0 голосов
/ 26 октября 2018

Я пытаюсь создать программу, которая печатает позицию самого левого 1 бита в C, но без циклов.

Это то, что я собрал до сих пор:

#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 голосов
/ 26 октября 2018

Вдохновленный этот вопрос , это решение, которое определяет без цикла 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;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...