20130320java基础学习笔记逻辑运算符和位运算

1.逻辑运算符:用语连接两个boolean类型的表达式;
&(与):
&:运算特点:
true & true = true;
true & false = false;
false & true = false;
false & false = false;
&:运算规律:
&运算的两边只要有一个为false,那么结果一定为false,只有两边都为true,结果才为true;

|(或):
|:运算特点:
true | true = true;
true | false = true;
false | true = true;
false | false = false;
|:运算规律:
|运算的两边只要有一个为true,那么结果一定为true,只有两边都为false,结果才为false;

^(异或):和或有点不一样;
^:运算特点:
true ^ true = false;
true ^ false = true;
false ^ true = true;
false ^ false = false;
^:运算规律:
^符号两边的结果如果相同,结果为false,两边的结果不同,结果为true;

!(非):非运算用来判断事物的另一面;
!true = false;
!false = true;
!!true = true;

面试题:
&&(双与):和&运算的结果是一样的,但是运算过程有点区别;
&和&&的区别:
&:无论左边的运算结果是什么,右边都参与运算;
&&:当左边的运算结果为false时,右边不参与运算;

||(双或):和|运算的结果是一样的,但是运算过程有点区别;
|和||的区别:
|:无论左边的运算结果是什么,右边都参与运算;
||:当左边的运算结果为true时,右边不参与运算;


~(取反):即将二进制数中的0变1,1变0;
负数的二进制值 = 正数的的二进制值取反 + 1(负数的二进制值最高为始终为1);如-5的二进制值的算法如下:
0000-0000 0000-0000 0000-0000 0000-0101 ---5对应的二进制值;
1111-1111 1111-1111 1111-1111 1111-1010 ---取反,即将0变为1,1变为0;
+0000-0000 0000-0000 0000-0000 0000-0001
-----------------------------------------
1111-1111 1111-1111 1111-1111 1111-1011 --->这个即是-5的二进制值;
由此可算出取反值X,X+1=-5 -----> ~5 = -6;


2.位运算:位运算是直接对二进制进行运算的
&(与运算):
6 & 3 = 2;
0000-0000 0000-0000 0000-0000 0000-0110
&0000-0000 0000-0000 0000-0000 0000-0011 ---->&运算特点:直接拿1去取上面的值;
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0010

|(或运算):
6 | 3 = 7;
0000-0000 0000-0000 0000-0000 0000-0110
|0000-0000 0000-0000 0000-0000 0000-0011--->|运算特点:直接取有效位,即为1(真)的就取;
-----------------------------------------
0000-0000 0000-0000 0000-0000 0000-0111

^(异或运算):一个数异或同一个数两次,结果还是这个数(6^3^3=6);---应用:异或可以用来加密解密,连续异或两次得到的还是原来的数;
6 ^ 3 ^ 3 = 6;
0000-0000 0000-0000 0000-0000 0000-0101
^0000-0000 0000-0000 0000-0000 0000-0011
--------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0110
^0000-0000 0000-0000 0000-0000 0000-0011
--------------------------------------------
0000-0000 0000-0000 0000-0000 0000-0101
<<(左移):左移几位其实就是该数据乘以2的几次方,可以完成2的次幂运算;
3 << 2 = 12 -->3*(2*2)=12;
3 << 3 = 24 -->3*(2*2*2)=24;

>>(右移):右移几位其实就是除以2的几次幂.对于高位出现的空位,原来高位是什么就用什么去补这个空位(即保证符号位一致(负正数),负数的二进制值中最高位是1);
6 >> 1 = 3 -->6/2=3;
6 >> 2 = 1 -->6/(2*2)=1(二进制中小数位将舍弃);

>>>(无符号右移):数据进行右移时,高位出现的空位,无论原高位是什么,空位都用0补,即无符号右移完后的值都是非负数;
 
原文地址:https://www.cnblogs.com/lisu/p/yx.html