将1添加到32位的位集

时间:2017-08-27 18:28:04

标签: c++ binary addition bitset

我有一个32位的bitset,我希望使用二进制加法方法为它添加1。所以我有一个二进制格式,现在我想以二进制样式添加1,是否有默认方法来完成它或者我必须为它创建一个函数。

        group_id | array_agg

        106      | {2147
                 |  2138
                 |  2144}
        107      | {2132
                 | 2510
                 | 2139}

2 个答案:

答案 0 :(得分:2)

std::bitset可以从unsigned longunsigned long long分配。

它还具有这些类型的访问器。

#include <bitset>

auto get() -> std::bitset<32>;
auto put(std::bitset<32>) -> void;

int main(){
    auto bs = get();
    bs = bs.to_ulong() + 1;
    put(bs);
}

示例汇编程序输出:

main:
  sub rsp, 8
  call get()
  lea edi, [rax+1]
  call put(std::bitset<32ul>)
  xor eax, eax
  add rsp, 8
  ret

请注意,编译器足够明亮,无需进行任何复制或转换。

答案 1 :(得分:2)

虽然答案本身很容易,但我会为一些好的编码风格建议做出贡献。

根据您显示的代码,您可以使用std::bitset::to_ulong(),然后在转换回来之前添加或执行任何操作。

但是您的代码上几乎没有样式问题,而且可能会破坏未来架构的某些逻辑。

int数据类型保证为标准的32位。它保证代表整数类型,您正在编译的架构是最有效的。

uint32_t是您所需要的,它保证在所有架构上都是32位长。

并且std::bitset并不擅长它的工作。对于大于int类型的大小,它根本不高效,因为需要进行索引,如果它低于int类型,则效率不高于long类型int类型。并且,通过使用它进行非按位操作的方法是将其转换为int 保证您的添加速度更快,甚至可以保持相同的速度这是uint32_t

因此,对于您的使用,最有效的类型肯定是 public function getVisitDelete($id){ $visits = Visit::find($id); $visits->products()->detach(); $visits->delete(); } ,无符号保护它在签名类型按位操作时保护某些未定义的行为。

而且,在编写高效且可维护的代码时,您可以阅读:Why is "using namespace std" considered bad practice?