C++右移運算符的一個小坑及解決
我遇到了這么一個函數(shù)
template<typename T>
unsigned char countByt(T byt)
{
unsigned char num=0;
while(byt)
{
num += (byt & 0x01);
byt >>= 1;
// cout<<hex<<byt<<endl;
}
return num;
}
很明顯,這個函數(shù)是統(tǒng)計byt二進制下1的個數(shù)。

沒毛病
但當我輸入負數(shù)的時候,就會陷入死循環(huán)。
用那行注釋中的東西輸出中間過程:

由此可以看到
- 在非負數(shù)下,右移運算符,左面補0.
- 在負數(shù)下,右移運算符,左面補1.
我對代碼進行如下修改:
template<typename T>
unsigned char countByt(T byt)
{
unsigned char num=0;
while(byt)
{
num += (byt & 0x01);
byt/=2;
//byt >>= 1;
//cout<<hex<<byt<<endl;
}
return num;
}負數(shù)的結(jié)果:

這個時候,統(tǒng)計的是其所對應(yīng)正數(shù)的1的個數(shù)。
也很好理解
補碼是其正數(shù)按位取反再加1
可以看到,一個數(shù)的正和負,它們最后一位一定是一樣的!
1、如果我們用/=2來的話:
-1/2=0
那結(jié)果跟正數(shù)統(tǒng)計是一樣的。
2、如果我們用>>=1的話:
-1:ffffffff
右移一位后,由于左側(cè)補1,
還是:ffffffff
死循環(huán)就發(fā)生了。
但我在實驗的時候又發(fā)現(xiàn)了有趣的一點:
int n;
while(cin>>n)
{
cout<<(n>>1)<<endl;
}1 0 -1 -1 2 1 -2 -1 3 1 -3 -2 9 4 -9 -5 8 4 -8 -4
可以看到:>>=1 等價于除以2后的(向下)取整。
而 / 運算符,是先對正數(shù)部分取整,再加符號。
因此對兩個int變量a,b:
a/b不一定小于 等于(double)a/b;
while(cin>>a>>b)
cout<<((a/b)<=((double)a/b))<<endl;
輸出:
5 3 1 -5 3 0 -5 -3 1 5 -3 0
總結(jié)
當使用右移運算符的時候,一定要注意輸入為負數(shù)的可能!在負數(shù)下 >>1 和 /=2 并不等價!
以上為個人經(jīng)驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關(guān)文章
如何使用Qt實現(xiàn)實時數(shù)據(jù)動態(tài)繪制的折線圖效果
使用Qt的QChartView和定時器,本教程詳細介紹了如何動態(tài)繪制折線圖,通過定時器觸發(fā)數(shù)據(jù)點的動態(tài)添加和坐標軸范圍的自動調(diào)整,實現(xiàn)了實時更新數(shù)據(jù)的動態(tài)折線圖應(yīng)用,程序結(jié)合QLineSeries或QSplineSeries繪制折線或樣條曲線,配合動畫效果,展現(xiàn)數(shù)據(jù)變化2024-10-10
visual?studio?2022一個不易發(fā)現(xiàn)的問題
本文主要介紹了visual?studio?2022一個不易發(fā)現(xiàn)的問題,文中通過示例代碼介紹的非常詳細,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2022-07-07
C語言之棧和堆(Stack && Heap)的優(yōu)缺點及其使用區(qū)別
本篇文章主要介紹了什么是棧(Stack) 、什么是堆( Heap),以及棧和堆的優(yōu)缺點,同時介紹了應(yīng)該什么時候使用堆和棧,有需要的朋友可以參考下2015-07-07
C++使用文件實現(xiàn)學(xué)生信息管理系統(tǒng)
這篇文章主要為大家詳細介紹了C++使用文件實現(xiàn)學(xué)生信息管理系統(tǒng),文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-01-01

