2017-08-27 112 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?