1樓:「已登出」
auto Func(unsigned long const &a)@Milo Yip
葉前輩雖然我寫了乙個版本的
但是感覺這個應該還不是最好的解決方案
有什麼指令能寫的更加優雅
2樓:
這個數是2的x次方,說明它的形式在二進位制是 0...0 1 0...0。
對int32一共也就32種可能。每個試驗一下是不是就行了嘛。當然,我這個答案和迴圈好像沒什麼區別嗎。。。。
3樓:路原
看了Milo Yip的回答,長姿勢了。我是來攪屎的。
test 用的是int,理論上支援其他長度資料#include
using namespace std;
template
class A
;template
T A::power = 0;
template
T A::num = 0;
template
bool A::bContinue = true;
int main()
{ int test_num = 2049;
if(test_num == 0return 0A::num = test_num;
A* a = new A[sizeof(int) * 8];
delete a;
cout<::power<
4樓:
學期初project寫過給32位整數的類似演算法,其實是腦筋急轉彎類,要求是不用超過1byte的整數,不用loop,不用邏輯都不行),只用bit的! ~ & ^ | + << >>寫
解法大概是:
①已知x,令y = ~x-1
y的樣子是高位一堆1,跟著乙個0 (後面還有數字,但是可以先不管)
高位有多少個1,也就是x高位有多少位是0了,也就能算出x的最高位
比如0x00ABABAB,左邊有8個0,y裡面左邊就有8個連續的1和乙個0
比如0x0,左邊有32個0,y就是全是1
②之後有個演算法,數左邊有多少個連續的1
先處理掉無關的數字:y&=
(y>>1);
y&=(y
>>2);
y&=(y
>>4);
y&=(y
>>8);
y&=(y
>>16);
這樣一位蓋一位,只要相鄰兩位不都是1,就全被&0刷成0了(可以在紙上寫出來試試),這個數於是變成了高位一堆1,接著一堆0,現在只需要數整個int有多少個1就行了
(例子,0x00ABABABAB現在變成了0xFF000000)
接下來其實只需要把每一位加在一起就行了,但是32個操作太麻煩,用點省事的。
③這個演算法是數乙個int裡面有多少個1
先造map:
mask1 = 0x55;
mask1 = mask1 + (mask1 << 8);
mask1 = mask1 + (mask1 << 16);
用這種野蠻方式把***這個bitmap拓展到全32位, 之後再把00110011,00001111, 0000000011111111都擴充套件到32位的map,最後乙個大map其實就是各乙個byte取乙個而已
(可以無視這一步↑,因為我們當時要求不能用超過1byte大的數)
關鍵步驟
y1 = (y&mask1) + ((y >> 1)&mask1);
y2 = (y1&mask2) + ((y1 >> 2)&mask2);
...右移mask掉再相加,得到的相當於是16個和。之後,分別繼續用另外三個map,把16個和加起來變成8個和,再變成4個,再變成2個,最後再加一下兩個byte,得到了乙個和,是個數,令它為n。這個n就是int裡面總共有多少位是1
之後回到②,我們知道了高位有n個1 (因為這n個連續的1之後就全是0了)
之後回到①
數清了1,我們就知道原來的那個x的最高位有n個連續的0了
最後一步,
寫完發現樓上發了更簡單實用的,我水平比較慘,這個就當腦筋急轉彎看吧,匿了。
5樓:Milo Yip
原問題是:「不用迴圈如何求乙個數是2的多少整數次方前提已知該數必然是2的整數次方?」
~~~Bit Twiddling Hacks: Find the log base 2 of an N-bit integer in O(lg(N)) operations with multiply and lookup
If you know that v is a power of 2, then you only need the following:
static
const
intMultiplyDeBruijnBitPosition2[32
]=;r
=MultiplyDeBruijnBitPosition2
[(uint32_t)(v
*0x077CB531U
)>>27];
另外,多數 CPU 提供 Find first set 這種運算的指令,而一般編譯器都會提供 intrinsic 函式如 _BitScanForward, _BitScanForward64、 __builtin_ffs(https://
gcc.gnu.org/onlinedocs/
gcc/Other-Builtins.html)等。
已知子網掩碼,如何求每個子網可以容納的主機數。?
聖境 最傻瓜式的。好比是現在的ip掩碼是255.255.128.0,不是255的部分相乘。末尾為零寫成256,最後減去2個不能用的廣播與零。那就是128 256 2 32766可用 真 路人 首先我們先考慮如何判斷兩個IP屬於同一子網,設子網掩碼為X,兩個IP位址為a,b。當X a X b時,a和b...
長輩的字都不能用求問邱姓女孩如何取名(已知 之,雨,夢,涵,婷,萌,小,櫻,清,華不能用)諧音不可?
丁梵 鑑於你的要求較多,我直接把方法告知你。起名的最佳方式是採用全組合起名,即能挖掘出符合自己心儀的美名佳選,又能備選做為字 筆名 網名 藝名的儲備,為一生的名正言順奠定好基礎。把符合當事人的八字 出生年月日時 納音五行 數理 吉順的字全部篩選出來,中間字 第二個字 尾字 第三個字 隨意搭配組合,得...
已知正數 x y 滿足 x y 1,如何求 5x 2 y 1 的最大值?
讓我用拉格朗日乘子法來吊打這個問題!Clear Global mathematica11.2,win7 64bit f 5 x 2 y 1 t x 2 y 2 1 拉格朗日乘子法建立目標函式 ans Solve D f,0,FullSimplify 求偏導數,求解方程組 aaa ans FullSi...