研究生要毕业了,最近要开始找工作,随便翻看一下基础知识。
逻辑操作符和位操作符都是操作符分类中的一种。
说明两个问题:
第一:短路逻辑操作符和非短路逻辑操作符的区别
短路逻辑与(&&) 短路逻辑或(||) 非短路逻辑与(&) 非短路逻辑或(|)
短路的意思就是,计算左操作数后,如果能决定表达式的值,那就不计算右操作数。
如: if(1==2&&1==1) //左操作数为假,表达式就一定为假了,就不计算右操作数了
非短路的意思就是,左右操作数都要计算完,才计算表达式的值
如: if(1==2&1==1) //先计算左操作数为假,右操作数为真,然后,真假为假
其实,基本用到的就是短路操作符,相比而言,其效率更高,非短路的我是很少用到的目前
不过,&和|也可以作为位操作符使用,这个可是经常用到的。
&:按位与 |:按位或 与:1,1为1,其他为0。或 0,0为0,其他为1。
别的基础的不说了!
第二:关于位操作符>> >>> <<的问题
>>:算术右移,左边直接补全符号位 >>>:逻辑右移,左边直接补全0 <<:算术左移,右边直接补全0
对于算术左移和算术右移,有计算公式:
a<<b <=> a*2的 b%(a类型的bit数) 次方
a>>b <=> a/2的 b%(a类型的bit数) 次方 前提是:|a|>=|b|
例如: -1>>1 用上面的公式算的话就是0。其实不是
就拿整数的默认类型int来说
对于-1 原码:10…………01
反码:11…………10
+1 负数的补码是原码取反再+1
补码:11…………11
所以说,对于-1的算术右移,其值是不变的,还是-1。因为补全的是符号位1。
对于逻辑右移,补全的是0。就变成了
补码:01…………11 正数的原码即补码
原码:01…………11 <=> 2147483647
正数和负数在计算机的存储虽说都是二进制,但是,实质是不一样的。
正数在计算机上存储的是原码 负数存储的是补码
位操作的本质:是对计算机上存储的二进制位进行操作的。
如上面的左右移,对于正数,移动的是原码 ,对于负数,移动的是补码。
正数的原码就是补码。负数的原码取反再+1才是补码。
所以才会有
-1>>1 为-1
-1>>>1 为2147483647