位运算的规则(算法村第十一关青铜挑战)

发布时间:2024年01月18日

位运算规则

与(&)0&0=00&1=01&0=01&1=1
或(|)0|0=00|1=11|0=11|1=1
异或(^)0^0=00^1=11^0=11^1=0

按位与:&

参与运算的两数对应的二进位相与,只有对应的2个二进位均为1时,结果位才为1 ,否则为0

例:6 & 1 = 0

0110(6的二进制)

&

0001(1的二进制)

=

0000 (0的二进制)

按位或:|

参与运算的两数对应的二进位相或,只要对应的2个二进位有一个为1时,结果位就为1。

例:5 | 8 = 13

0101(5的二进制)

|

1000(8的二进制)

=

1101 (13的二进制)

按位异或:^

参与运算的两数各对应的二进位相异或,当对应的2个二进位相异时,结果位为1,相同则结果位为0。

例:9 ^ 5 = 12,
1001(9的二进制)

^
0101 (5的二进制)

1100 (12的二进制)

按位取反:~

对参与运算的数的各二进位按位求反。

~9:
~(1001) = 0110

左移:<<

按二进制形式把所有的数字向左移动对应的位数,高位舍弃,低位补零。

需要移位的数字 << 移位的次数

3 << 2 = 12

(0011 移位后得 1100)

在数字没有溢出的前提下,左移 n 位就相当于乘以 2n 次方。

右移:>>

按二进制形式把所有的数字向右移动对应的位数,低位舍弃,高位补符号位(即正数补零,负数补1)。

需要移位的数字 >> 移位的次数

11>>2 = 2

(1011 移位后得 0010 )

对于正数,右移 n 位相当于除以 2n 次方。

位运算操作

判断 num 的第 i 位是否为 1

public boolean getBit(int num, int i)
{
    return (num & (1 << i)) != 0;
}

num 的第 i 位设置为 1

public int setBit(int num, int i)
{
    return num | (1 << i);
}

num 的第 i 位清零

public int clearBit(int num, int i)
{
    int mask = ~(1 << i); //形如 1110111
    return num & mask;
}

num 的第 i 位更新为 v

public int updateBit(int num, int i, int v)
{
    num = clearBit(num, i); //将 num 的第 i 位清零
    return num | (v << i);  //将 num 的第 i 位设置为 v
}

补充

原码、反码、补码

  • 原码:一个整数按照绝对值的大小转化成二进制的数

  • 反码:将二进制数按位取反

  • 补码:反码加 1

负数以正数的补码表示

进制表示

  • 2进制用0b表示

  • 8进制用0o表示

  • 10进制用0d表示

  • 16进制用0x表示

文章来源:https://blog.csdn.net/cjj2543107638/article/details/135679801
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。