CJson中一個十分有趣的二進制轉換

先上代碼段

static int pow2gt (int x)	
{
	--x;
	x|=x>>1;
	x|=x>>2;	
	x|=x>>4;	
	x|=x>>8;	
	x|=x>>16;	
	return x+1;	
}

這段代碼是取任意一個數字的最小2的N次冪,因爲計算機內存是以二進制來存儲的,因此在一些內存申請中可以簡化,並且可以運用到其他的方面。

先看原理介紹。–x 和 末尾的 x+1可以防止溢出(個人認識),x|x>>1;是將x轉化爲二進制然後向右移動位數(這裏移動一位),然後取或運算符,可以將其設置爲1最後可以得到從1開始的數字。這是二進制運算中的按或運算符,接下來以2147483648爲例(–x後得到的數字),2147483648在計算機中以二進制儲存是10000000 00000000 00000000 00000000 (int爲四字節,因此有32位),
11000000 00000000 00000000 00000000 x|x>>1
11110000 00000000 00000000 00000000 x|x>>2
11111111 00000000 00000000 00000000 x|x>>4
11111111 11111111 00000000 00000000 x|x>>8
11111111 11111111 11111111 11111111 x|x>>16
``因爲二進制轉化爲十進制是通過冪來累加的,這樣可以做到最高位後的所有位數都爲1,即最終結果得到了大於2的最小二次冪。如果有興趣的讀者可以自己實踐實踐,例如代入4,5,6進行求最終結果,會發現這是非常奇妙的`

若有一些不正確的地方歡迎大家批評指正。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章