• 位元 字组 二进制运算 以及 编码


    字组就是把一个数的二进制的各位看成数组~~

    <1>计算机中的反码与补码;

    最高位:正数为0,负数为1;

    正整数的原码,反码,补码均相同;

    负数的反码:符号位不变,在原码的基础之上数值位取反;

    负数的补码:求出反码后加1;如-1(只看8位);原码:1000 0001 反码:1111 1110 补码:1111 1111; //在使用scanf()输入到EOF时返回-1;这是我们可以使用位取反运算符变为0,即将所有(包括符号位)的1变为0~~

    <2>位运算

    1.把字组中最靠右的1变为0:  如 0101 1110 => 0101 1100

      x & (x - 1);

    2.取出字组中最靠右的1 (数值不是第几位):  如 1010 0100 => 0000 0100

      x & (-x);  // 树状数组中的lowbit()

    3.最低位0变为1: 如 1010 0111 => 1010 1111

      x|(x+1)   //x+1具有递推性

    4.把字组尾部的1都变成0:如1010 0111 => 1010 0000

      x & (x + 1) //删除用 &

    5.把字组尾部的0变为1:如 1010 1000 => 1010 1111

      x | (x - 1) //添加用 |

    6.把字组中最靠右且值为0的位元变为1,其余位元置0; 如 1010 0111 => 0000 1000

      ~x & (x + 1) //注意取反

    7.把字组中最靠右且值为1的位元变为0,其余位元置1;如 1010 1000 => 1111 0111

      ~x | (x - 1) // x - 1只是将x的最低为1的位元置0;并且把尾部为0的位元变为1

    8.把字组尾部为0的位元置1,其余位元置0;如 1010 1000 = > 0000 0111

      ~x & (x - 1)  可以发挥处理器的某些指令级优化,还可以使用 (x & -x) - 1

    9.把尾部的所有值为1的位元都变成0,其他位都置为1;如 1010 0111 => 1111 1000

      ~x | (x+1)

    10.把最靠右且值为0的位元及其右方所有值为1的位元都置为1,其他位元设为0;如 0101 0111 = > 0000 1111

      x ^ (x + 1) // xor同样能把原数中的字组1删除

    待续~~

  • 相关阅读:
    题解 P3842 【[TJOI2007]线段】
    题解 CF1366A 【Shovels and Swords】
    题解 CF1391D
    题解 CF1374B 【Multiply by 2, divide by 6】
    CSP-J2020爆零记
    YbtOJ20025 放置石子
    YbtOJ20001 立方数差
    [仅供参考]W-RB的码风及要求
    [敲黑板]CSP考试策略
    [水沝淼㵘]向量水解
  • 原文地址:https://www.cnblogs.com/hxer/p/5217841.html
Copyright © 2020-2023  润新知