• 逻辑运算&位运算


    今天有人问我,逻辑运算是什么,现在来解释一下
    逻辑运算就是相当于信息竞赛基础工具中的一位的位运算


    符号对应关系:
    (wedge)=(cap)(交)=&=and=与运算
    (vee)=(cup)(并)=|=or=或运算
    ( eg)=~=not=非
    ^=xor=异或运算
    x>>k=将x的二进制右移k位(如:x=((10110)_2)时,k=1,那么x>>k=((1011)_2),k=2,那么x>>k=((101)_2)
    x<<k=将x的二进制左移k位(如:x=((10110)_2)时,k=1,那么x<<k=((101100)_2),k=2,那么x<<k=((1011000)_2)


    先来看看一位的位运算:
    现有两个bool型a,b

    not a
    a=1 0
    a=0 1
    a and b a or b a xor b
    a=1,b=1 1 1 0
    a=1,b=0 0 1 1
    a=0,b=1 0 1 1
    a=0,b=0 0 0 0

    再来看各种的码(原码,反码,补码)
    默认有符号(就是正负符号)

    1. 原码:就是原来的数(无符号)
    2. 反码:(符号:~)
      1. 原码除符号位的每一位取反(原码为负)
      1. 原码(原码为正)
    3. 补码:(符号:-)
      1. 反码加1(原码为负)
      1. 原码(原码为正)

    现在再来看按位与,按位或,按位异或
    现在有两个二进制数
    a=((1001010011)_2)
    b=((0101001010)_2)
    那么
    a&b=((1001010011)_2)&((0101001010)_2)=((1000000000)_2)&((0000000000)_2)+((000000000)_2)&((100000000)_2)+……+((1)_2)&((0)_2)=((0001000010)_2)
    a|b=((1001010011)_2)|((0101001010)_2)=((1000000000)_2)|((0000000000)_2)+((000000000)_2)|((100000000)_2)+……+((1)_2)|((0)_2)=((1101011011)_2)
    ab=$(1001010011)_2$((0101001010)_2)=((1000000000)_2)$(0000000000)_2$+$(000000000)_2$((100000000)_2)+……+((1)_2)^((0)_2)=((1100011001)_2)(可以理解为不进位二进制加法)


    lowbit运算:(树状数组必用)
    因为在补码表示下~x=-x-1
    lowbit(x)=x&(~x+1)=x&(-x)
    可以找出整数二进制下最后一个是1的位
    例:x=((10101100)_2)
    则~x=((01010011)_2),-x=((01010100)_2)
    ( herefore (00000100)_2=(10101100)_2 & ((01010011)_2+1)=(10101100)_2 & (01010100)_2)
    ( herefore lowbit(x)=x&(-x))

  • 相关阅读:
    测试阅读量
    JS中的 length, var i = [1,2]; i[length], 与 i.length, i["length"]的区别
    微信小程序:button组件的边框
    mongo学习笔记
    C言语语法总结(随时更新)
    Vim 常用命令总结
    php 文件操作
    git常用命令
    递归方式转迭代方式
    ECMAScript6 ES6 ES2015新语法总结
  • 原文地址:https://www.cnblogs.com/Wuzhuoming-sirenboke/p/13778320.html
Copyright © 2020-2023  润新知