zoukankan      html  css  js  c++  java
  • 位运算的技巧

      在讨论位运算之前有必要补充一下计算机底层使用的编码表示,计算机内部存储、计算的任何信息都是由二进制(0和1)表示,而二进制有三种不同的表示形式:原码反码补码。计算机内部使用补码来表示。

      原码,就是其二进制表示(注意,有一位符号位)
      反码,正数的反码就是原码,负数的反码是符号位不变,其余位取反
      补码,正数的补码就是原码,负数的补码是反码+1

      符号位,最高位为符号位,0表示正数,1表示负数。在位运算中符号位也参与运算。

    按位与操作 &

    1 1 1
    1 0 0
    0 1 0
    0 0 0
     

    例如:3 & 17 = 1

      3=00000011

      17=00010001

      &=00000001

    按位或操作 |

    1 1 1
    1 0 1
    0 1 1
    0 0 0
     

    例如:3 | 17 = 1

      3=00000011

      17=00010001

      |=00010011

    左移操作 <<

      左移操作 << 是把操作数整体向左移动,左移操作是二目运算符。

      例如:33 << 2 = 100001 << 2 = 10000100 = 132

      -2147483647 << 1 = 10000000000000000000000000000001 << 1 = 10 = 2 (符号位也参与运算)

      技巧:a << n = a * 2^n (a为正数)

    右移操作 >>

      右移操作 >> 是把操作数整体向右移动,右移操作是二目运算符。

      例如:33 >> 2 = 100001 >> 2 = 001000 = 8

      -2147483647 >> 1 = 10000000000000000000000000000001 << 1 = 11000000000000000000000000000000 = -1073741824 (符号位也参与运算,补足符号位)

      技巧:a >> n = a / 2^n (a为正数)

     
    按位异或操作 ^
    按位异或  ^ 操作是把两个操作数做按位异或操作,其中两位相同则为0,不同则为1,按位异或是二目运算符,又称为不进位加法。
    1 ^ 10
    1 0 1
    0 1 1
    0 0 0
     

    例如:33 ^ 12 = 45

      33=00100001

      12=00001100

      ^ = 00101101

      技巧:异或是不进位加法,两个数做加法,把进位舍去

     
     
     
  • 相关阅读:
    Linux Shell参数替换
    Linux下redis的安装
    Make 命令教程
    linux环境变量 export命令详解
    Java分布式应用技术架构介绍
    centos mysql忘记密码
    <context:component-scan>使用说明
    Spring <context:annotation-config/> 解说
    [Visio]直线工具和连接线工具的区别
    [Visual Studio Code] 字体设置
  • 原文地址:https://www.cnblogs.com/tuanz/p/13408383.html
Copyright © 2011-2022 走看看