2017-08-27 72 views
2

我有一个32位的位集,并且我希望使用二进制加法方法给它加1。所以我有一个二进制格式,现在我想以二进制样式添加1,是否有一个默认的方法来做到这一点,或者我将不得不为它创建一个函数。将1加1到32位的位集

#include<string.h> 
    #include<iostream> 
    #include<bitset> 
    #include<cstlib> 
    int main(){ 
     int a; 
     cin >> hex >> a; 
     bitset<32> binary(a); 
     } 

回答

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 

注意,编译器是光明的,足以认识到,没有必要做任何复制或转换。

2

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

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

但是,您的代码有几个样式问题,并且可能会破坏未来体系结构的一些逻辑。

int数据类型是不是保证是32位的标准。这是保证代表整体类型你正在编译的架构是最有效的。

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

std::bitset并不是真的擅长它的工作。对于尺寸大于int类型的尺寸,效率不高,因为需要进行索引编制,如果尺寸小于int类型的尺寸,则不会比int类型更有效。而且,由于使用它执行非按位运算的方法是将其投射到long,所以它是而不是保证您的添加速度将会更快,甚至与使用int时的速度相同。

因此,为了您的使用,最有效的类型将确定为uint32_t,未签名保护其在签名类型按位操作上的某些未定义行为。

而且,虽然您在编码高效且易于使用的代码,但您可以阅读以下内容:Why is "using namespace std" considered bad practice?