向左/向右移动,添加0 / 1并去掉第一个位
Shift left/right adding zeroes/ones and dropping first bits
我必须编写一个接收
的函数- 为二进制数,如
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位。
相关文章:
- 获取向量C++中第一个值和最后一个值的和
- 有没有一种"cleaner"的方法可以在指向基的指针向量中找到派生类的第一个实例?
- 当我在第一个循环中使用"auto"时,它工作正常,但是使用"int"它会给出错误,为什么?
- 我有两个类需要在同一 cpp 文件中相互引用,但第一个类无法识别第二个类类型的对象
- 为什么有时我输入一个整数,程序将第一个输入的数字打印成十进制数?
- 如何在创建自定义迭代器时获得 std::p air 的第一个和第二个?
- 如何实现 Front() 方法以返回模板化双向链表C++的第一个元素?
- WinAPI 在单击第一个对话框上的按钮控件并销毁第一个对话框后创建第二个对话框
- 查找数组中第一个最小值和最后一个最大值元素之间的算术平均值
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- C++部分概念 id:显式模板规范顺序/第一个参数的特殊状态的原因是什么?
- 静态堆栈函数不会 1) 输入第一个元素 2)添加新元素时识别旧元素
- 如何从一个向量中删除最小元素并添加到另一个向量,而第一个变为空?
- 如何在具有相同第一个索引 (c++) 的二维矩阵中添加值
- 将添加到队列的第一个元素作为 null 进行排序
- 将第一个虚拟函数添加到类中
- 设置仅添加C++中的第一个元素
- 在链表中的specifeec元素之后添加元素,并删除第一个元素
- C++死亡预测-第一个如何在循环中添加百分比的程序