& 与 && 的区别
相同点
&和&&都可作逻辑与的运算符,表示逻辑与(and),当运算符两边的表达式的结果都为true时,其结果才为true,否则,只要有一方为false,则结果为false。(ps:当要用到逻辑与的时候&是毫无意义,&本身就不是干这个的)
不同点
if(loginUser!=null&&string.IsnullOrEmpty(loginUser.UserName))
- &&具有短路的功能,即如果第一个表达式为false,则不再计算第二个表达式,对于上面的表达式,当loginUser为null时,后面的表达式不会执行,所以不会出现NullPointerException如果将&&改为&,则会抛出NullPointerException异常。
ps:所以说当要用到逻辑与的时候&是毫无意义的 - & 是用作位运算的。
- &是位运算,返回结果是int类型
- &&是逻辑运算,返回结果是bool类型
位运算的使用
符号 | 意义 | 运算对象类型 | 运算结果类型 | 示例 |
~ | 逻辑非运算 | 整型、char | 整型 | ~a |
& | 逻辑与运算 | 整型、char | 整型 | a&b |
| | 逻辑或运算 | 整型、char | 整型 | a|b |
<< | 位左移运算 | 整型、char | 整型 | a <<2 < td> |
>> | 位右移运算 | 整型、char | 整型 | a>>2 |
01 位逻辑与运算:&
& 与运算是将两个运算对象按位于进行与运算。规则是:
1&1=1
0&1=0
0&0=0
如图:
15的二进制是(ps:16位int,32位int多打16个0浪费流量)
0000000000001111
20的二进制是
0000000000010100
15&20的结果是4
0000000000001111
0000000000010100
结果:
0000000000000100
02 位逻辑或运算
| 位逻辑或运算是将两个运算对象按位进行或运算,运算的规则是:
1|1=1
1|0=1
0|0=0
两位对比有一个1即为1
如15|20的结果计算结果就是31
0000000000001111
0000000000010100
结果:
0000000000011111
03 位逻辑异或运算: ^
^位逻辑异或运算 是将两个运算对象按位进行异或运算,规则是:
1异或1等于0
1异或0等于1
0异或0等于0
即:相同得0,相异得1。15^20= 27(0001 1011)
00001111(15)
00010100(20)
^运算后的结果
00011011(27)
04.位逻辑左移运算<<
<<位逻辑左移运算是将按位向左边移动若干位,左移后空出的部分为0。
比如15的二进制0000 1111 左移8位就是1111 0000 0000
0000000000001111
>> 左移8位的结果:
0000111100000000
15<<8=3840
左移3位(15<<3)就是0111 1000结果是120
a<<1 =2
a<<2 =4
a<<3 =8
结论a左移n位就是相当于a乘2的n次方。
05 位逻辑右移运算 >>
位逻辑右移运算是将按位向右边移动若干位,右移后空出的部分为0 比如 0000 1111(15)左移3位(15<<3)就是0000 0001(1)
00001111(15)
左移3位结果是:
00000001(3)
右移相当于整除,右移1位相当于除以2的1次方,右移2相当于除以2的2次方。(ps:这个除法是计算机的除法,你懂得)
06 位运算还能干嘛
- 如将一个月的签到记录保存到1个int类型中
- 判断奇偶数
- 权限设置,增删改查4个操作,合并成一个整型
- 交换两个数
- 计算2的3次方最高效就是用位运算左移<<
- 计算a的b次方
- 一组整型数据,找出没有重复的数
布莱恩特:《居然不知道&和&&的区别?》