二进制与位运算 二进制 位运算 “^”运算 位运算的优先级

  • 说明:
    (1)位运算符中除 ~ 外,均为二目运算符,即要求出侧各有一个运算量。
    (2)运算早只能是整型或字符型的数据,不能为实型数据。
  • 使用位移运算可以提高因乘除运算带来的效率的问题,它的缺点是存在精度损失且不直观。
  • 使用移位运算来避免乘法运算是一种常用技巧,不过乘数必须都是正整数,而且必须至少有一个是 2 的 n 次方,例如:2,4,8,16,32……移位运算的特点是速度快,而乘法运算速度较慢,把乘法运算转化为移位运算可以稍微提高程序运行效率。
  • 例题1:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31

    12 * 2 = 12 << 1
    12 * 4 = 12 << 2
    12 * 8 = 12 << 3
    12 * 16 = 12 << 4
    12 * 32 = 12 << 5
    12 * 64 = 12 << 6
    12 * 128 = 12 << 7
    12 * 256 = 12 << 8
    //除法
    12 / 2 = 12 >> 1
    12 / 4 = 12 >> 2
    12 / 8 = 12 >> 3
    12 / 16 = 12 >> 4
    12 / 32 = 12 >> 5
    12 / 64 = 12 >> 6
    12 / 128 = 12 >> 7
    12 / 256 = 12 >> 8
    //其它
    num *= 32;
    //等同于
    num <<= 5;
    /* 2 的 5 次方等于 32 */
    //如果乘数不是 2 的 n 次方,我们可以把乘数分解成几个 2 的 n 次方的和:
    num *= 20;
    //等于
    num *= (16 + 4);
    //等于
    num = num * 16 + num * 4;
    //等于
    num = (num << 4) + (num << 2);

二进制

  • 原码:指一个二进制数左边加上符号位后所得到的码,且当二进制数大于0时,符号位为0;二进制数小于0时,符号位为1;二进制数等于0时,符号位可以为0或1
  • 反码:正数的反码与其原码相同;负数的反码是对其原码逐位取反,但符号位除外。
  • 补码:正数的补码与原码相同,负数的补码是其对应正数二进制所有位取反后加1。
  • 在计算机中通常使用补码进行储存
  • 二进制的最末位为0表示该数是偶数,最末位为1表示该数为奇数

位运算

“~”运算

又称取反运算,就是对一个二进制数按位取反。
对于 int 来说,~x = −x−1

“&”运算

  • “&”运算,即“and” 运算,也是一种逻辑运算符,对于二进制运算来说,“&”运算的意义是对于两个二进制数的每一位,除了11得1,其他均为0
  • 可以用 & 运算判断一个数是奇数还是偶数,当 x 为奇数时, x 二进制下的第 0 位一定是 1 ,否则为 0 。我们让x & 1,就可以知道 x 的奇偶性了。
    • &运算通常用于二进制取位操作,例如一个数 &1的结果就是二进制的最末位。所以可以用来判断奇偶性
    • 举个栗子:10101(21) & 11100(28) = 10100{20}
  • 如果参加 & 是负数(-3 & -5),则以补码形式表示为二进制数。然后按位进行 与 运算。

  • x & (x - 1)用于消去x二进制最后一位的1

    1
    2
    3
    x = 1100            00|0100|1100
    x - 1 = 1011 00|0100|1011
    x & (x - 1) = 1000 00|0100|1000

“|” 运算

  • 即 “or” 运算,也是一种逻辑运算符,对于二进制运算来说,“|” 运算的意义是对于两个二进制数的每一位,除了00得0,其它都是1
    • 举个栗子:10101(21) | 11100(28) = 11101(29)
  • 通过与运算和或运算的栗子可以观察到一下规律:x & y<=xx | y>=x

“^”运算