第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問(wèn)題,去搜搜看,總會(huì)有你想問(wèn)的

如何檢查一個(gè)數(shù)字是否為2的冪

如何檢查一個(gè)數(shù)字是否為2的冪

如何檢查一個(gè)數(shù)字是否為2的冪今天,我需要一個(gè)簡(jiǎn)單的算法來(lái)檢查一個(gè)數(shù)字是否是2的冪。算法需要:簡(jiǎn)約對(duì)任何ulong價(jià)值。我想出了一個(gè)簡(jiǎn)單的算法:private bool IsPowerOfTwo(ulong number){     if (number == 0)         return false;     for (ulong power = 1; power > 0; power = power << 1)     {         // This for loop used shifting for powers of 2, meaning         // that the value will become 0 after the last shift         // (from binary 1000...0000 to 0000...0000) then, the 'for'         // loop will break out.         if (power == number)             return true;         if (power > number)             return false;     }     return false;}但后來(lái)我想,檢查一下log2 x是正整數(shù)嗎?但當(dāng)我檢查2^63+1時(shí),Math.Log因?yàn)樗纳嵛迦敕祷亓?3。因此,我檢查了冪63的2是否等于原來(lái)的數(shù)字-是的,因?yàn)橛?jì)算是在doubles而不是確切的數(shù)字:private bool IsPowerOfTwo_2(ulong number){     double log = Math.Log(number, 2);     double pow = Math.Pow(2, Math.Round(log));     return pow == number;}這個(gè)回來(lái)了true對(duì)于給定的錯(cuò)誤值:9223372036854775809.有更好的算法嗎?
查看完整描述

3 回答

?
墨色風(fēng)雨

TA貢獻(xiàn)1853條經(jīng)驗(yàn) 獲得超6個(gè)贊

要解決這個(gè)問(wèn)題,有一個(gè)簡(jiǎn)單的技巧:

bool IsPowerOfTwo(ulong x){
    return (x & (x - 1)) == 0;}

注意,此功能將報(bào)告true0,這不是2..如果您想排除這一點(diǎn),下面是如何:

bool IsPowerOfTwo(ulong x){
    return (x != 0) && ((x & (x - 1)) == 0);}

解釋

首先也是最重要的,是MSDN定義中的按位二進(jìn)制&操作符:

二進(jìn)制&運(yùn)算符是為積分類(lèi)型和bool預(yù)定義的。對(duì)于整型,計(jì)算邏輯位數(shù)及其操作數(shù)。對(duì)于bool操作數(shù),&計(jì)算邏輯和它的操作數(shù);也就是說(shuō),結(jié)果是真的當(dāng)且僅當(dāng)它的兩個(gè)操作數(shù)都是真的。

現(xiàn)在讓我們來(lái)看看這一切是如何發(fā)生的:

函數(shù)返回布爾值(true/false),并接受一個(gè)輸入?yún)?shù)(在本例中為x)。為了簡(jiǎn)單起見(jiàn),讓我們假設(shè)有人傳遞了值4并調(diào)用了函數(shù),如下所示:

bool b = IsPowerOfTwo(4)

現(xiàn)在,我們將x的每次出現(xiàn)替換為4:

return (4 != 0) && ((4 & (4-1)) == 0);

我們已經(jīng)知道4!=0為真,到目前為止還不錯(cuò)。但是關(guān)于:

((4 & (4-1)) == 0)

當(dāng)然,這意味著:

((4 & 3) == 0)

但究竟什么是4&3?

4的二進(jìn)制表示為100,3的二進(jìn)制表示為011(記住&接受這些數(shù)字的二進(jìn)制表示)。所以我們有:

100 = 4011 = 3

假設(shè)這些值被堆疊起來(lái),就像基本加法一樣。這個(gè)&運(yùn)算符表示,如果兩個(gè)值都等于1,則結(jié)果為1,否則為0。所以1 & 1 = 11 & 0 = 00 & 0 = 0,和0 & 1 = 0..所以我們計(jì)算一下:

100011----000

結(jié)果就是0。因此,我們回頭看看返回語(yǔ)句現(xiàn)在轉(zhuǎn)換為:

return (4 != 0) && ((4 & 3) == 0);

現(xiàn)在翻譯為:

return true && (0 == 0);
return true && true;

我們都知道true && true是簡(jiǎn)單的true,這表明,在我們的例子中,4是2的冪。


查看完整回答
反對(duì) 回復(fù) 2019-06-25
  • 3 回答
  • 0 關(guān)注
  • 851 瀏覽
慕課專(zhuān)欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購(gòu)課補(bǔ)貼
聯(lián)系客服咨詢(xún)優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)