二进制位交换,反转,与统计1的个数
生活随笔
收集整理的這篇文章主要介紹了
二进制位交换,反转,与统计1的个数
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題一:給一個整數v,求它的二進制表示中從右往左數第x位和第y位交換后的值(從0開始計數)。
?
分析:舉個例子,如果v的二進制表示為XXXXaXXXXXXbX,我們交換第1位和第8位。我們是這樣做的:
先把這兩位的值都取零后的值保存在一個變量里面,即tmp = XXXX0XXXXXX0X,然后再取ans = 0000b000000a0,那么可
以看出tmp | ans就是答案了。現在關鍵是求ans,ans可以成是這樣,ans = (((v>>y)&1)<<x)?|?(((v>>x)&1)<<y)。
?
那么很容易寫出代碼:
unsigned int _swap(int v,int x,int y) {return v & (~(1 << x)) & (~(1 << y)) | (((v >> y) & 1) << x) | (((v >> x) & 1) << y); }
?
問題二:給一個十進制整數v,求它的二進制表示反轉后對應的十進制數。
unsigned int Bit_Reverse(unsigned int v) {v = ((v >> 1) & 0x55555555) | ((v << 1) & 0xaaaaaaaa);v = ((v >> 2) & 0x33333333) | ((v << 2) & 0xcccccccc);v = ((v >> 4) & 0x0f0f0f0f) | ((v << 4) & 0xf0f0f0f0);v = ((v >> 8) & 0x00ff00ff) | ((v << 8) & 0xff00ff00);v = ((v >> 16) & 0x0000ffff) | ((v << 16) & 0xffff0000);return v; }
?
對char型數據處理:
unsigned char Bit_Reverse(unsigned char ch) {ch = (ch &0x55) <<1| (ch >>1) &0x55;ch = (ch &0x33) <<2| (ch >>2) &0x33;ch = (ch &0x0F) <<4| (ch >>4) &0x0F;return ch; }
?
問題三:給定一個數x,求它的二進制表示中有多少個1。
int cnt(unsigned int x) {x = x - ((x>>1)&0x55555555);x = (x & 0x33333333) + ((x>>2)&0x33333333);x = (x + (x>>4)) & 0x0f0f0f0f;x = (x + (x>>8));x = (x + (x>>16));return x&0x3f; }
?
總結
以上是生活随笔為你收集整理的二进制位交换,反转,与统计1的个数的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: sscanf()函数的用法
- 下一篇: DP之花店橱窗布置