c语言位运算 求1个整数的二进制数有多少个1
???? 今日見到1個函數(shù), 它的作用是求1個整數(shù)的二進制數(shù)有多少個1.
???? 函數(shù)如下:
unsigned long fun(unsigned long x) {int count = 0 ;while(x){count++;x = x & (x - 1);}return count; }???? 看了半小時才看懂, 關(guān)鍵是那個 x = x & (x - 1)的意就是把x 化為二進制數(shù)后, 把最右邊的1變成0.
???? 這樣整個函數(shù)就很容易明白了。
???? 問題就是 x = x & (x - 1) 為何會把x 的二進制最右邊的1變成0呢?
???? 首先& 是1個位運算符, 注意跟邏輯運算符 && 的區(qū)別啊。
???? & 的叫做“位與”, 它的規(guī)則就是 如果兩個位都是1 則返回1, 否則返回0
???? 也就是說
???? 1 & 1 == 1;
? ?? 0 & 0 == 0;
? ?? 1 & 0 == 0;
? ?? 0 & 1 == 0;
???
?????? 10011101
???? & 10101000
——————————
?????? 10001000
? ?? 我們把假定 x 的二進制數(shù)是A1B, 其中B是n個0(n是任意非負整數(shù))。 而A不受限制
? ?? 假如 A是1001? B是3個0, 那么 x就是 10011000了
???? 而且A和B中間那個1就是這個二進制數(shù)的最右邊的1, 因為B是n個0嘛。
???? 那么 x-1 就肯定是? A0C了, C是n個1.
???? 比如 上面的例子 10011000 - 1 == 10010111 所以 C就是3個1了。
???? 所以x & (x -1) 就是
?????? A1B
???? & A0C
___________
?????? A0B
????? 就如???? 10011000
???????????? & 10010111
???????? ————————
?????????????? 10010000
???
???? 最終A0B? 比起A1B就是去掉最右邊的1個1啊, 就是這樣證明的。
https://sgsinm02.tcs.com/
總結(jié)
以上是生活随笔為你收集整理的c语言位运算 求1个整数的二进制数有多少个1的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据结构 二叉树的遍历
- 下一篇: Oracle connet by pri