向左/向右移动,添加0 / 1并去掉第一个位

Shift left/right adding zeroes/ones and dropping first bits

本文关键字:第一个 添加 右移 移动 向左      更新时间:2023-10-16

我必须编写一个接收

的函数
  • 为二进制数,如10001,和
  • 表示我应该执行多少次移位的十进制数。

问题是,如果我使用c++操作符<<, 0被从后面推,但第一个数字没有被丢弃…例如

shifLeftAddingZeroes (10001 1)

返回100010而不是00010,这是我想要的。

我希望我已经说清楚了= p

我假设您将该信息存储在int中。考虑到这个数字实际上比你看到的有更多的前导零,因此你的数字很可能是16位,即00000000 00000001。也许你可以试着让数字和你想要的数字一样多?(假设您想坚持按位操作)。

你想要的是位移位,然后限制可以激活的输出位的数量(保持1的值)。这样做的一种方法是为你想要的位的数量创建一个掩码,然后与该掩码的位移位值。下面是这样做的代码示例,只需将int_type替换为您使用的值的类型——或者使其成为模板类型。

int_type shiftLeftLimitingBitSize(int_type value, int numshift, int_type numbits=some_default) {
    int_type mask = 0;
    for (unsigned int bit=0; bit < numbits; bit++) {
        mask += 1 << bit;
    }
    return (value << numshift) & mask;
}

您的10001,1的输出现在将是shiftLeftLimitingBitSize(0b10001, 1, 5) == 0b00010

请注意,除非你的numbits正好是你的整数类型的长度,否则你的数字的"前面"总是有多余的0位。

相关文章: