можно ли упростить проверку первого бита любой переменной?

Основной вопрос можно ли обойтись без первого if в процедуре checkFirstBit(int size_arg, ...) Второй вопрос можно ли сделать еще проще? Третий вопрос все ли по феншую с данным решением? начиная от смысловой части решения, заканчивая оформлением? заранее спасибо за конструктивную критику и предложения.

#include <stdio.h>
#include <stdlib.h>

void checkFirstBit(int size_arg, ...)
// процедура проверяет первый бит переменной на равенство "1" и выводит переменную, если TRUE'''
{
    int bit_num = 8; // для побитового вывода переменной 
    int *ptr = &size_arg + 1; // адрес переданной переменной
    int binary_cond; 
// можно ли обойтись без данного if?
    if (size_arg == 1) binary_cond = 0x80;
    else if (size_arg == 2) binary_cond = 0x8000;
    else binary_cond = 0x8000000;

    if (*ptr & binary_cond)
    {
        for (int i = 0; i < bit_num * size_arg; i++)
        {
            printf("%c", (*ptr & binary_cond) ? '1' : '0');
            *ptr <<= 1;
        }
        printf("\n");
    }
    else printf("First byte is zero\n");
    return 0;
}

int main()
    char fifth;
    fifth = 0b10100110;

    int size_arg = sizeof(fifth);
    printf("%d\n", size_arg);

    checkFirstBit(size_arg, fifth);
    return 0;
}

Ответы (1 шт):

Автор решения: Harry

Давайте решим более корректно поставленную задачу: определение, установлен ли старший бит в массиве из N байт по адресу ptr.

Здесь, если мы рассматриваем эти байты как представление числа, нам нужно различать little endian и big endian. На всякий пожарный :)

Так что я бы делал так:

#define IS_BIG_ENDIAN (!*(unsigned char *)&(uint16_t){1})

int msb_1(void * ptr, unsigned int n)
{
    if (IS_BIG_ENDIAN) return (*(unsigned char *)ptr & 0x80) != 0;
    return (*((unsigned char *)ptr + n-1) & 0x80) != 0;
};

int main()
{
    unsigned char a = 0b10100110;
    unsigned char b = 0b00100110;

    int c = -7;
    int d = 7;

    printf("%d\n", msb_1(&a,1));
    printf("%d\n", msb_1(&b,1));

    printf("%d\n", msb_1(&c,sizeof(c)));
    printf("%d\n", msb_1(&d,sizeof(d)));

}
→ Ссылка