簡體   English   中英

是否有一種簡單的方法來獲得std :: bitset的2的補碼<N>

[英]Is there a trivial way to get the 2's complement of an std::bitset<N>

我在我的程序中使用了std::bitset<N> ,需要找到最不重要的設置位並進行如下的微不足道的計算:

int num = 5;
int res = num & (-num);

之后,在res設置num的最低有效位,並且全部為0 這有效,因為-5用2的補碼表示法表示。

但我發現std::bitset<N>對於一元運算operator -沒有任何運算符重載operator -這會給我基礎位的2的補碼。 有沒有一種簡單的方法來實現std::bitset<N>的2的補碼? 我總是可以使用operator ~來翻轉位並在它們上面循環執行求和並從LSB開始到MSB,但我正在尋找一種可以避免這種情況的解決方案。

std::bitset不提供任何補充方法。 因為你必須自己用operator~和一個額外的循環來計算補碼,所以只需跳過operator~()並直接搜索LSB:

template <int N>
size_t least_significant_bit(const std::bitset<N> &bt){
    for(size_t i = 0; i < bt.size(); ++i){
        if(bt.test(i))
            return i;
    }
}

我想它不能比那更簡單;)。

請注意,如果根本沒有位,則不指定least_significant_bit的結果。 可以返回N或更改循環以測試bt.test(N) ,這將引發異常,但畢竟在一個空的bitset中尋找LSB並沒有多大意義。

另請注意,如果您對邊界檢查不感興趣,可以使用std::bitset<N>::operator[]而不是std::bitset<N>::test

進行二進制補碼的一種非常方便的方法是在bitset中找到最不重要的0,將其設置為1並將所有較低有效位設置為0。

偽代碼:(假設set [0]是最低有效位,如果不是,則轉動它)

int i = 0;
while (i < set.length && set[i])
  {
     set[i] = 0;
     ++i;
  }

if (i < set.length)
  set[i] = 1;

除非我遺漏了什么,否則應該這樣做

std::bitset<N> twos_comp = std::bitset<N>((~input).to_ulong() + 1);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM