![](/img/trans.png)
[英]Fastest way of counting occurences of 1's in multiple std::bitset<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.