位运算符

本文介绍了位运算符,包括负数的二进制表示、按位与(&)、按位或(|)、按位异或(^)、取反(~)、左移(<<)和右移(>>). 对于每个运算符,详细阐述了它们的运算规则和典型应用场景,如数值转换、位操作技巧等。

负数二进制表现形式

负数是以补码的形式表示,其转换方式,简单的一句话就是:先按正数转换,然后取反加1。负数的二进制最高位是1
要将十进制的-10用二进制表示,先将10用二进制表示:
0000 0000 0000 1010
取反:
1111 1111 1111 0101
加1:
1111 1111 1111 0110
所以,-10的二进制表示就是:1111 1111 1111 0110

按位与( & ) ---- 同1为1,否则为0

在这里插入图片描述
1. 自身与自身按位与结果都为自身

System.out.println(88&88);  88

2. 任何数和0按位与都是0

System.out.println(88453413&0);  0

3. 奇数和1按位与得1;偶数和1按位与得0

System.out.println(56&1);  0
System.out.println(65&1);  1

4. N&(N-1)用于消去二进制最后一个1

x = 12      二进制:1100
x-1=11      二进制:1011
x&(x-1)=8   二进制:1000    1100的第二个1内消去

5. 如果一个数N是2的n次方,N&(N-1)=0

2 --> 10   4 --> 100   8 --> 1000  16 --> 10000
因为2的n次方这个数N的二进制表示中只有一个1,所以使用N&(N-1)将唯一的一个1消去,如果N是2的幂次,那么N&(N-1)得到结果为0
System.out.println(4096&4095);   0

6. 根据4的原理,可以获取一个数的二进制有多少个1

int num=124;
int i=0;
while (num>0){
    num = num&(num-1);
    i++;
}
System.out.println(i);

按位或( | ) ---- 同0为0,否则为1

1. 任何数和0按位或都是自身

System.out.println(88453413|0); 88453413

按位异或( ^ ) ---- 相同为0,不同为1

1. 自身与自身按位异或结果都为0

System.out.println(5^5);  0  

2. 任何数与0异或都是自身

System.out.println(88453413|0);   88453413

3. 一个数连续与另一个数异或两次,得到自身

System.out.println(88453413^5656^5656);    88453413

4. 多个数异或结果与顺序无关

System.out.println(8^9^45);   44
System.out.println(45^9^8);   44
System.out.println(8^45^9);   44

5. 根据3和4的原理,可以交换变量

a = a ^ b;
b = b ^ a;     注: b = b^a^b = b^b^a = 0^a = a   此时b已经变成了原来的a
a = a ^ b           a = a^b^b^a^b = a^a^b^b^b = 0^0^b = b  a变成了原b 

取反( ~ )

左移( << ) ---- 左移一位的结果就是原值乘2

右移( >> ) ---- 左移一位的结果就是原值除2

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值