写在前面:大大小小的位运算和逻辑运算,自己见的倒是挺多的,也基本没有错误。但是上次在面试的时候,面试官问我请你说说Java的位运算有哪些,我脑子一下就乱了,你要是考我答案我倒是知道,但是让我自己全部说出来,就有难度了。于是,借此机会做一个总结。。。。。。
然后再次反思了自己所学的知识,认为一定要有相应的体系结构,不然知识就是乱的(感觉自己学了很多,但真的让你说的时候,又没有对应的主线将知识串起来),而且极易忘记。
文章目录
1、6个基础位运算符
基础位运算,针对二进制数字的计算。在很多代码的底层都是利用位运算来提升程序执行的效率。当然我们在做一些算法题的时候也可以这么做。
分享一个自己曾经记录的一个用于判断单双数的代码
//如果num是单数,那么其对应的二进制末尾数字一定是1
//000...101 -- 5
//000...001 -- 1
//000...001 -- 1 结果等于1,表示num为单数
//000...110 -- 6
//000...001 -- 1
//000...000 -- 0 结果等于0,表示num为双数
if(num & 1 ==0) {
//双数后的方法体
}
位运算针对的是数字(二进制)计算
符号 | 描述 | 运算规则 | ||
---|---|---|---|---|
and | & | 与 | 两个位都为1时,结果才为1 | |
or | | | 或 | 两个位都为0时,结果才为0 | |
xor | ^ | 异或 | 两个位相同则为0,相异为1 | |
not | ~ | 取反 | 0变1,1变0 | |
shl | << | 左移 | 各二进位全部左移若干位,高位丢弃,低位补0 | |
shr | >> | 右移 | 各二进位全部右移若干位,对无符号数,高位补0,有符号数,各编译器处理方法不一样,有的补符号位(算术右移),有的补0(逻辑右移) |
2、4个逻辑运算符
逻辑运算针对的是boolean值的运算
逻辑运算又称布尔运算,它的结果应该是一个真假值,也就是true还是false。
1)&&:短路与运算。同为真时才为真。如果遇到第一个为false,后面的就不再运算,直接false
4>1&&3>0 -> true&&true -> true
1>4&&7>2 -> false&&... -> false
2)||:短路或运算。同为假时才为假,也就是说有一个为真即为真。如果遇到第一个是true,后面的也不再计算,直接true
2>3||3>2 -> false&&true -> true
5>3||2>4 -> true&&... -> true
3)!:非运算。! true=false,! false=true。只能对布尔值进行操作
!true==false -> false==false -> true
!true==true -> false==true -> false
4)^:异或运算。相同的为false,不同的为true该符号与位运算的异或相同,我们需要区别它们在不同的位置上的具体含义
true^true -> false
false^false -> false
true^false -> true
false^true -> true