【问题标题】:how to create a mask for a given data type?如何为给定的数据类型创建掩码?
【发布时间】:2014-02-07 06:16:10
【问题描述】:

我有一个整数,它的 sizeof 将在运行时确定。现在,我想根据它的大小使用它进行遮罩。

例如,如果 int 的大小为 2 个字节,则掩码值为 0xFF。如果整数的大小是 4 字节,那么掩码值为 0xFFFF。我该怎么做?另外,最后我想从一个数字中提取最重要的半字节。我怎样才能聪明地做到这一点?

【问题讨论】:

  • 0xff 占用一个字节,而不是两个字节。
  • 对于掩码值,只需使用UINT_MAX(假设它实际上是2字节的0xFFFF和4字节的0xFFFFFFFF)。
  • 您可以使用(1ul << (sizeof(int) * CHAR_BIT)) - 1 来屏蔽int(但您为什么要这样做?)——至于MSN,它是number >> (sizeof(number) * CHAR_BIT - 4)
  • @Yuushi 而不是UINT_MAX,不是吗? 16 位 INT_MAX 将是 0x7FFF。
  • 整数的大小不是在运行时确定的。在编译时就已经知道了。

标签: c++ c


【解决方案1】:

//假设你拿signed int

0XFFFFFFFF == -1(在 4byte int 机器中)

0XFFFF == -1(在 2byte int 机器中)

0XFF == -1(在机器中的 1 个字节中,不再存在)

所以在运行时,即使大小增加,分配给 -1 的变量也会增加。

计算 MSB x 是你的号码

if( ( (0 | 1) << sizeof(int) & x) > 0)
    //MSB is 1
else 
    // MSB is 0 

【讨论】:

    【解决方案2】:
    #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;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-12-05
      • 2018-11-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多