位运算竟然是这样简单,让你精通位运算!
Posted 韶光不负
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了位运算竟然是这样简单,让你精通位运算!相关的知识,希望对你有一定的参考价值。
其实在基本的初学习者心中,当我们遇到一个算法题时我们喜欢使用的是“+,-,*,/”,很难联系到位运算。因为对没有掌握的人来说有一定的难度,下面就和小编一起来看看位运算到底都有什么!
目录
二个数交换(^运算:异或二个相同的数0,0和任何数异或为本身)
为什么要使用位运算?
首先我们都知道,电脑是看不懂我们的文字的,能看懂的是二进制码,所以我们通常使用的+,-,*,/都是开发者定义好了,我们自己用的,当一段代码实现某一个功能的时候,我们想要提高代码的时间复杂度(时间复杂度简单一点说就是时间)时,我们就可以考虑使用位运算。位运算是对操作数的二进制位进行运算,操作数与计算结果都是整数!
位运算的基本与使用(移动一次 :左移乘2 右移除2)
位运算 | 含义 | 实例 | 结果 |
<< | 有符号左移(有符号取二进制数最高位为符号位,0为正,1为负) | 4<<1 | 8 |
>> | 有符号右移 | 4>>1 | 2 |
>>> | 无符号右移 | 4>>>2 | 1 |
& | 与运算 | 4&2 | 0 |
| | 或运算 | 4|2 | 6 |
^ | 异或运算(二个相同的数进行异或时为0) | 4^2 | 6 |
~ | 取反运算 | ~4 | -5 |
& 与运算:
把二个要计算的数转化为二进制数,进行相与(&),只要一个为0,结果就为0,否则为1.
int sum=0;
sum=3&4;
System.out.println(sum);
| 或运算:
把二个要计算的数转化为二进制数,进行相或(|),只要一个为01,结果就为1,否则为0.
int sum=0;
sum=3|4;
System.out.println(sum);
^ 异或运算:
任何相同的二进制数进行异或(^),结果为0,不同二进制异或(^),运算结果为1.
int sum=0;
sum=3^4;
System.out.println(sum);
~取反运算:
把数转化为二进制,0变1,1变0.
转化完成后为二进制补码(正数转负数),
补码转化为源码
源码转补码 | 补码转源码 |
二进制源码取反,加1 | 补码二进制减1,再取反 |
int sum=0;
sum=~4;
System.out.println(sum);
<< 左移(箭头指那,向那移,移几位乘2的几次方)
把数转化为二进制数,按照指定的次数进行左移动、最高位丢弃,右边补齐0。
int sum=0;
sum=4<<2;
System.out.println(sum);
>> 右移(箭头指那,向那移,移几位除2的几次方)
把数转化为二进制数,按照指定的次数进行右移动,最高位是0,左边补齐0。最高位是1,左补齐1。
int sum=0;
sum=4>>2;
System.out.println(sum);
>>> 无符号右移
把数转化为二进制数,不关正负,默认都是正数。按照指定的次数进行右移动,不管最高位是0还是1,左边补齐0。
int sum=0;
sum=4>>>2;
System.out.println(sum);
应用场景
奇偶数判断(&运算)
当我们把一个数转化为二进制时:最低位为1就是奇数,不然就是偶数:
原因:只有最低为是1,其他位都是2倍数。
奇偶判断:
方法就是与1&(与),和1相与(&),奇数就是1,偶数就是0.
public static void main(String[] args) {
//找出100内的奇数
for (int i = 0; i <101 ; i++) {
if(1 == (i & 1)){
System.out.print(i+" ");
}
}
}
二个数交换(^运算:异或二个相同的数0,0和任何数异或为本身)
public static void main(String[] args) {
int x=5;
int y=6;
//异或二个相同的数0,0和任何数异或为本身
x=x^y;
//下面表达式y=y^x^y
y=y^x; //此时y=x;
System.out.println(y);
//下面表达式y=y^x^x
x=x^y;
System.out.println(x);
}
以上是关于位运算竟然是这样简单,让你精通位运算!的主要内容,如果未能解决你的问题,请参考以下文章