以文本方式查看主题 - 计算机科学论坛 (http://bbs.xml.org.cn/index.asp) -- 『 C/C++编程思想 』 (http://bbs.xml.org.cn/list.asp?boardid=61) ---- 一些有关C++语言中的bit操作[转帖] (http://bbs.xml.org.cn/dispbbs.asp?boardid=61&rootid=&id=25756) |
-- 作者:enorm -- 发布时间:12/21/2005 1:51:00 PM -- 一些有关C++语言中的bit操作[转帖] Author:Jeff 2005-11-30 关键字:C/C++ bit 位操作
以下大多从网上和书中来,有些则加入了个人的见解~~ 1) 函数实现交换两个int型变量的值,要求不定义任何中间变量。 C / C++ 版: void Swap(int *a, int *b) { *a^=*b; *b^=*a; *a^=*b; } C++ 版: void Swap(int &a, int &b) { a^=b; b^=a; a^=b; } 分析一下: (a ^ b = s) (b ^ s = a) 0 ^ 1 = 1 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 1 = 1 1 ^ 1 = 0 1 ^ 0 = 1 0 ^ 0 = 0 0 ^ 0 = 0 归结一下:1. 两个数相异或,相同的位清0,不同的位置1。 (所以才有了 XOR eax, eax ;eax清零) 2. s = (a ^ b); (b ^ s) == a ? Yes. 异或加密解密的基础.
2) 摘自《高效程序的奥秘》一书。英文书名<Hacker’s Delight>,译为《黑客的窃喜》 获得后缀0bit的个数。(从低位开始的连续的0bit,间接地求最低位的1bit的位置) int ntz(unsigned x) { // Number of trailing zeros. int n; if (x == 0) return(32); n = 1; if ((x & 0x0000FFFF) == 0) {n = n +16; x = x >>16;} if ((x & 0x000000FF) == 0) {n = n + 8; x = x >> 8;} if ((x & 0x0000000F) == 0) {n = n + 4; x = x >> 4;} if ((x & 0x00000003) == 0) {n = n + 2; x = x >> 2;} return n - (x & 1); }
3) 除了最低位的bit1,其余位全清0. <Hacker’s Delight>一书。 n = n & (-n) < - - - - > n = n & (~n + 1) 分析一下: 假设n(2) = X…X10…0。其中每个X代表bit值并不都是相同,0的个数≥0,¯X表示该位取反。 X & ¯X = 0, 1 & 0 = 0 则~n(2) = ¯X…¯X01…1。 ~n + 1 = ¯X…¯X10…0。 n & (~n + 1) = 0…010…0
4) 清最低位的bit1,其他不变。 n = n & (n – 1); 则 n – 1 = X…X01…1 n & (n - 1) = X…X00…0 5) 获得bit1的个数。(统计) 我们常用的方法: int Get1BitCount(unsigned int x) { int n = 0; while (x > 0) { if (x & 0x1) n++; x >>= 1; } return n; } 另一种更好的办法: int Get1BitCount(unsigned int x) { int n = 0; while (x > 0) { n++; x = x & (x - 1); } return n; } 6) 求unsigned int型数一共有多少bit?(网上看到有人问) int nCount = Get1BitCount((unsigned int)~0); 求别的数据类型的位数,要重载Get1BitCount(或者直接用temlate来实现)。 不过觉得像上面这样求法,太浪费了,不是吗? int GetTotalBit(void) { unsigned int x = ~0; int n = 0; while (x > 0) { n += 8; x >>= 8; } return n; } 7) 清除低位到高位的n个bit1。 while (--n > 0) { x = x & (x - 1); } 8) (以后有再慢慢更新) |
W 3 C h i n a ( since 2003 ) 旗 下 站 点 苏ICP备05006046号《全国人大常委会关于维护互联网安全的决定》《计算机信息网络国际联网安全保护管理办法》 |
31.250ms |