Как создать маску для данного типа данных?

0

У меня есть целое число, размер которого будет определен во время выполнения. Теперь я хочу использовать это для маскировки в зависимости от его размера.

Например, если размер int равен 2 байтам, то значение маски равно 0xFF. Если размер целых чисел равен 4 байтам, то значение маски равно 0xFFFF. Как я могу это сделать? Кроме того, в конце концов, я хочу извлечь из числа наиболее значимый кусок. Как я могу сделать это разумным способом?

  • 4
    0xff занимает один, а не два байта.
  • 2
    В качестве значения маски просто используйте UINT_MAX (при условии, что он на самом деле равен 0xFFFF для 2 байтов и 0xFFFFFFFF для 4 байтов).
Показать ещё 6 комментариев
Теги:

2 ответа

0
#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;
}
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 

Ещё вопросы

Сообщество Overcoder
Наверх
Меню