java 位运算

左移、右移

左移  
    <<      低位补 0
右移  
    >>      这是有符号右移。若值为正,则在高位插入0;若值为负,则在高位插入1。
    >>>     则是无符号右移。无论正负,都在高位插入0。

特点:
    1、不溢出情况下,右移相当于除 2
    2、不溢出情况下,左移相当于乘 2

移位运算[速度]高于乘除运算

异或

两个相应位相同,则结果为0,否则为1。如下
    10100001
    ^
    00010001
    =
    10110000

总结
    0 异或任何数 = 任何数 
        0^0=0
        0^1=1

    1 异或任何数 = 任何数取反 
        1^0=1
        1^1=0

特点:
    1、可以用来使某些特定的位翻转。
        如对数 10100001 的第2位和第3位翻转,可以将数与  00000110 进行按位异或运算。
        10100001
        ^
        00000110
        =
        10100111

        等价于 1010 0001 ^ 0x06

    2、可以实现两个值的交换,而不必使用临时变量
        a = 10100001
        b = 00000110 
        交互 a、b 的值
            a = a ^ b;  // a = 10100111 
            b = a ^ b;  // b = 10100001
            a = a ^ b;  // a = 00000110

    3、数 a 两次异或同一个数 b(a=a^b^b)仍然为原值a.

两个相应位只要出现了 1 结果就为 1,否则为 0。如下
    1000 0001
    |
    0001 1011
    =
    1001 1011

总结
    0 或任何数(target目标位) = 任何数(target目标位)
        0|0=0   --> 0 或 0 (该 0 表示的上述的任何数) 为 0
        0|1=1   --> 0 或 1 (该 1 表示的上述的任何数) 为 1

    1 或任何数 = 1
        1|0=1
        1|1=1

特点:
    1、可以用于指定设置某几位的值为 1
        如设置 1100 1010 1010 0000 的第 4、9、11 为 1
        1100 1010 1010 0000
        |
        0000 0101 0000 1000
        =
        1100 1111 1010 1000

两个相应位都为 1 结果就为 1,否则为 0。如下
    1000 0001 1001 0010
    &
    0001 1011 1111 1111
    =
    0000 0001 1001 0001

总结
    1 与任何数(target目标位) = 任何数(target目标位)
        1|0=0   --> 1 与 0 (该 0 表示的上述的任何数) 为 0
        1|1=1   --> 1 与 1 (该 1 表示的上述的任何数) 为 1
    0 与任何数(target目标位) = 0

    总结一句话:当且仅当 1 与 1 才为 1,否则为 0


特点:
    1、可以用于指定设置某几位的值为 0
        如设置 1110 0100 1010 1000 的第 6、8、11 为 0
        1110 0100 1010 1000
        &
        1011 1111 0101 1111
        =
        1010 0111 0101 1000

操作符为 ~
直接上例子
    0000 0000 0000 0000 1000 0001
    非操作结果为
    1111 1111 1111 1111 0111 1110

    0000 0000 0000 0000 0001 1011
    非操作结果为
    1111 1111 1111 1111 1110 0100

总结
    一元运算符,位取反。
    1 非 --> 0
    0 非 --> 1

你可能感兴趣的:(【java】,java,位运算)