二进制的学习总结

二进制的基础

  and &    (按位取与)  1 & 1  =  1   1 & 0 = 0  0 & 0 = 0  0 & 1 = 0

  or    |      (按位取或)  1 | 1 = 1  1 |  0 = 1  0 | 0 = 0  0 | 1 = 0

  xor    ⊕/^  (按位异或)   1⊕1 = 0  1⊕0 = 1  0 ⊕0 = 0  0 ⊕1 = 0

    lsh  <<  (逻辑左移)将二进制数向左移动x位造成二进制数右边不足用0补足,左边高位溢出

    rsh >>   (逻辑右移)将二进制数向右移动y位造成二进制数左边补足用0补足,右边高位溢出

    not    ~     (按位取反)  每一位0变1,1变0

注意:二进制操作的优先级好像很低,所以进行计算时可以多打写括号反正又不会累死

二进制的基本操作

读取x的第pos个二进制位:      (x >> pos)& 1;

读取x的第pos位开始的cnt位:    (x >> pos)& ((1 << cnt) - 1);

将x的第pos位置为1:        (1 << pos)| x;

将x的第pos位置为0:        (~(1 << pos))& x;

将x的第pos位取反:         (1 << pos) ⊕ x;

将x的末尾的1提取出来:       x & (x ⊕ (x + 1));

二进制中最低位的一个1的位置:      lowbit(x) = x & (-x);

遍历二进制中所有的1的位置:    for(; x; x -= lowbit(x));

判断一个数的奇偶性:         (x & 1) ? 偶数 : 奇数;

对2的幂取模 :             x & ((1 << y)  - 1)

二进制表示集合

  枚举子集  for(int i = x; i ; i = (i & (i - 1));  

 

posted @ 2018-07-17 18:38  玥~endlessly~vast  阅读(220)  评论(0编辑  收藏  举报