hacker' 是计算机狂热爱好者,是循环用计算机用更新鲜聪明的方法做一些 new or old 的事情。
位操作一般应用在:
- 高低位互换:x >> 8 | x << 8 & 0xFF00
- 判断是否是 2 的幂:x & (x-1)
- 加密:参见博客《密码学》
- 无参交换 :a ^= b ^= a ^= b
- 代替 %,如果 n % m,m 是 2 的幂,就可以改为 n &(m-1)。
基础:
- x & (x-1) == 0 [判断2的幂]
- 【下一个具有同样数目 1 位的更大数,如1024 -> 2048, malloc函数使用了这个】
unsigned snoob( unsigned x )
{
unsigned smallest, ripple, ones;
smallest = x & -x;
ripple = x + smallest;
ones = x ^ ripple;
ones = (ones>>2) / smallest;
return ripple | ones;
}
4. ((x>>30) | 1)*x; 【求绝对值,有限制】
5. n & 0x1; 【判断[1奇 | 0偶]】
6. n >> 1; 【除以2】
7. n << 1; 【乘以2】
8. a%b == a&(b-1);【模数b是2的幂时成立】
9. Abs(x) ((x^(x>>31)) - (x>>31)); 【取绝对值】
============================================================================
常用位操作 :
根据位逻辑性质推出
1.判断a二进制数中有几个1
a & (a-1); count++;2.将a第b位置1
#define by1(a,b) ((a) |= (1<<(b)))
将a第b位置0
#define by0(a,b) ((a) &= (0<<(b))) //思路
#define by0(a,b) ((a) &= ~(1<<(b)))//实现3.判断第b位的状态
#define if ((a) & (1<<(b)))
∮异或 加密要注意明文和密钥相等的情况。不然会置零。a = 0 等同于 a ^= a...4.去掉最后一个1 : a >> 1
5.在最后添加0 : a << 1 或者 1 : (a<<1)+1
6.把最后一个变成1 : x | 1
7.把最后一个变成0 : (x | 1) -1 //注意优先级
8.最后一个取反 : x ^ 1
9.把右数第n个数变成1 : x | (1<<(n-1))
a.把右数第n个数变成0 : x & ~(1<<(n-1))
b.右数第n个数取反 : x ^ (1<<(n-1))
c.取低8位(末8位) : x & 255
d.取低k位(末k位) : x & ((1<<k) - 1)
e.取右数第k位 : x >> (k-1) & 1
f.把末k位变成1 : x | ((1<<k) - 1)
g.末k位取反 : x ^ ((1<<k)-1)
11.取右边连续的1 : (x^(x+1)) >> 1
位图算法:
1. i >> 32 将 i 定位到那个 int(4 bytes) 中,即 A[i >> 32]
2. i & 0x1F 等同 i%32 只保留 i 的0~4位(5bits),(1<< (i & 0x1F) ) 接着把 1 左移与运算的结果bits
3. 将 a[i>>32] 和 i & 0x1F 组合可以实现:
- 位设置(或) a[i>>32] |= (1<< (i & 0x1F) )
- 位清除(取反、与) a[i>>32] &= ~(1<< (i & 0x1F) )
- 获得结果(与) a[i>>32] & (1<<(i & 0x1F) )
资料推荐 :https://blog.csdn.net/qq_32924343/article/details/81026237
更多位操作以及加密解密算法会持续更新。