У меня есть целое число, размер которого будет определен во время выполнения. Теперь я хочу использовать это для маскировки в зависимости от его размера.
Например, если размер int равен 2 байтам, то значение маски равно 0xFF. Если размер целых чисел равен 4 байтам, то значение маски равно 0xFFFF. Как я могу это сделать? Кроме того, в конце концов, я хочу извлечь из числа наиболее значимый кусок. Как я могу сделать это разумным способом?
#include <stdio.h>
#include <limits.h>
unsigned Most_Significant_nibble(int number){
int numOfHalfBit = sizeof(number) * CHAR_BIT / 2;
unsigned num = number, mask = (1u << numOfHalfBit)-1;
return (num >> numOfHalfBit) & mask;
}
int main(void){
int n = 0x87654321;//size of int is 4
unsigned msn = Most_Significant_nibble(n);
printf("%#x\n", msn);//0x8765
return 0;
}
//Предполагая, что вы берете signed int
0XFFFFFFFF == -1
(в машине 4 байта int)
0XFFFF == -1
(в машине 2 байта int)
0XFF == -1
(в 1 байт в машине, которого больше нет)
поэтому во время выполнения, даже если размер увеличивается, ваша переменная назначается на -1.
Чтобы вычислить MSB x
являющийся вашим номером
if( ( (0 | 1) << sizeof(int) & x) > 0)
//MSB is 1
else
// MSB is 0
0xff
занимает один, а не два байта.UINT_MAX
(при условии, что он на самом деле равен 0xFFFF для 2 байтов и 0xFFFFFFFF для 4 байтов).