C++右移運(yùn)算符的一個(gè)小坑及解決
我遇到了這么一個(gè)函數(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;
}
很明顯,這個(gè)函數(shù)是統(tǒng)計(jì)byt二進(jìn)制下1的個(gè)數(shù)。

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

由此可以看到
- 在非負(fù)數(shù)下,右移運(yùn)算符,左面補(bǔ)0.
- 在負(fù)數(shù)下,右移運(yùn)算符,左面補(bǔ)1.
我對(duì)代碼進(jìn)行如下修改:
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;
}負(fù)數(shù)的結(jié)果:

這個(gè)時(shí)候,統(tǒng)計(jì)的是其所對(duì)應(yīng)正數(shù)的1的個(gè)數(shù)。
也很好理解
補(bǔ)碼是其正數(shù)按位取反再加1
可以看到,一個(gè)數(shù)的正和負(fù),它們最后一位一定是一樣的!
1、如果我們用/=2來的話:
-1/2=0
那結(jié)果跟正數(shù)統(tǒng)計(jì)是一樣的。
2、如果我們用>>=1的話:
-1:ffffffff
右移一位后,由于左側(cè)補(bǔ)1,
還是:ffffffff
死循環(huán)就發(fā)生了。
但我在實(shí)驗(yàn)的時(shí)候又發(fā)現(xiàn)了有趣的一點(diǎ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 等價(jià)于除以2后的(向下)取整。
而 / 運(yùn)算符,是先對(duì)正數(shù)部分取整,再加符號(hào)。
因此對(duì)兩個(gè)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é)
當(dāng)使用右移運(yùn)算符的時(shí)候,一定要注意輸入為負(fù)數(shù)的可能!在負(fù)數(shù)下 >>1 和 /=2 并不等價(jià)!
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
使用Qt開發(fā)實(shí)現(xiàn)字幕滾動(dòng)效果
我們經(jīng)常能夠在外面看到那種滾動(dòng)字幕,那么就拿qt來做一個(gè)吧,文章通過代碼示例給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作有有一定的參考價(jià)值,需要的朋友可以參考下2023-11-11
基于c中使用ftruncate()前需要fflush(),使用后需要rewind()的深入探討
本篇文章是對(duì)在c中使用ftruncate()前需要fflush(),使用后需要rewind()進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05
C語言實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)簡(jiǎn)單的飛機(jī)大戰(zhàn)游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-05-05
C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之順序數(shù)組的實(shí)現(xiàn)的相關(guān)資料,這里提供實(shí)現(xiàn)實(shí)例,希望通過本文能幫助到大家,需要的朋友可以參考下2017-08-08
C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法
這篇文章主要介紹了C++實(shí)現(xiàn)判斷一個(gè)字符串是否為UTF8或GBK格式的方法,涉及C++針對(duì)字符編碼的遍歷、判斷、編碼轉(zhuǎn)換等相關(guān)操作技巧,需要的朋友可以參考下2017-11-11
C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇
這篇文章主要為大家詳細(xì)介紹了C++結(jié)構(gòu)體數(shù)組實(shí)現(xiàn)貪吃蛇,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2020-03-03

