【问题标题】:Shift left/right adding zeroes/ones and dropping first bits向左/向右移动填充零/一并删除第一位
【发布时间】:2013-03-28 23:30:59
【问题描述】:

我必须编写一个函数来接收

  • 一个二进制数,如10001,和
  • 一个十进制数,表示我应该执行多少班次。

问题是,如果我使用 C++ 运算符<<,零会从后面推入,但第一个数字不会被丢弃...例如

shiftLeftAddingZeroes(10001,1)

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

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

【问题讨论】:

  • 你的数字应该总是有 5 位?
  • 不,它们可以有随机数量的位。
  • 那么数字表示“停止”在哪里?在最重要的“1”处?
  • 好吧,从问题来看,OP 似乎希望保留与输入相同的位数。
  • 最高lit位是否表示您要保留的位数?

标签: c++ binary shift


【解决方案1】:

我假设您将该信息存储在 int 中。考虑到这个数字实际上比你看到的有更多的前导零,所以你的数字很可能是 16 位,意思是 00000000 00000001 。也许尝试与具有与移位后想要的数字一样多的 1 的数字进行与运算? (假设你想坚持按位运算)。

【讨论】:

    【解决方案2】:

    您想要的是移位,然后限制可以激活的输出位数(保持值为 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 位。

    【讨论】:

      猜你喜欢
      • 2022-07-22
      • 1970-01-01
      • 2012-08-07
      • 2018-07-10
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 2014-10-24
      • 2014-12-10
      相关资源
      最近更新 更多