当前位置: 首页 > 工具软件 > hacker-blog > 使用案例 >

hacker' - 位操作

金正阳
2023-12-01

hacker' 是计算机狂热爱好者,是循环用计算机用更新鲜聪明的方法做一些 new or old 的事情。

位操作一般应用在:

  • 高低位互换:x >> 8 | x << 8 & 0xFF00
  • 判断是否是 2 的幂:x & (x-1)
  • 加密:参见博客《密码学
  • 无参交换 :a ^= b ^= a ^= b  
  • 代替 %,如果 n % m,m 是 2 的幂,就可以改为 n &(m-1)。

 

基础:

  1.      x & (x-1) == 0      [判断2的幂]
  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


更多位操作以及加密解密算法会持续更新。

 类似资料: