можно ли упростить проверку первого бита любой переменной?
Основной вопрос можно ли обойтись без первого 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)));
}