代码之家  ›  专栏  ›  技术社区  ›  John Proctor

C中位的掩蔽范围

  •  3
  • John Proctor  · 技术社区  · 6 年前

    我正在尝试用C编写一个方法,它接受三个整数:start、end和mask。如果掩码为1,则除起始到结束范围内的位外,所有位均设置为0,且该范围内的位均设置为1。我目前正在使用此部分:

    for (int i = 0; i < (end - start + 1); i++)
    {
      if (mask == 1)
      {
        ret |= ret << 1;
        ret |= ret | 1;
      }
    }...ret = ret << start;
    

    (其中“ret”是无符号int,如果掩码为1,则从0开始;如果掩码为0,则从~ 0开始)。然而,我似乎无法找到另一种方法:将一个位范围屏蔽为0,然后将其余的全部设置为1。

    1 回复  |  直到 6 年前
        1
  •  3
  •   Sergey Kalinichenko    6 年前

    由于将遮罩从1翻转到0只会反转结果,因此可以忽略遮罩,为 mask == 1 ,如果掩码为零,则在末尾翻转其位:

    int ret = 0;
    for (int i = start ; i <= end ; i++) {
        ret |= 1 << i;
    }
    if (!mask) {
        ret = ~ret;
    }