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

本文详细介绍了位运算的基本规则,包括按位与、或、异或、取反、左移和右移的操作,以及如何使用Java中的方法进行位操作,同时提及了原码、反码和补码的概念。
摘要由CSDN通过智能技术生成

位运算规则

与(&)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表示

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值