或非和java的移位操作符
作者:互联网
MECE 原则,提升逻辑思维水平
MECE 原则(Mutually Exclusive Collectively Exhaustive)的中文意思是“相互独立,完全穷尽”,简而言之,能够做到不重叠、不遗漏,兼顾排他性和完整性
。
MECE 原则是麦肯锡提出的一种结构化思考方式,无论是报告撰写,提案演讲,业务分析,它是一种很好的思维方式。
LeetCode.剑指56:I
public class _56_I数组中数字出现的次数 {
public static void main(String[] args) {
int[] nums = {2,4,6,1,4,2};
int mask=0;
int a = 0;
int b = 0;
//寻找两个不重复的数的二进制相异的二进制位数:第一个1
// 0 ^ x = x; 1 ^ 1 = 0; //联想到半加器来理解
for (int num : nums){ //这里求出想要的 mask = a^b的值, 用于比较出二进制相异的二进制位数:第一个1
mask ^= num;
}
//找到用于比较出二进制相异的二进制位数:第一个1
int index = 1;
while ( (mask & index) == 0){ index = index << 1; }
//根据index,将两个不同的数分组,同时该位为1 / 0 的重复出现的数会被分到一组,因为值相同
// 2,2,4,4,6
//1
for (int num : nums){
if ( (index&num) == 0 ){ //利用0^x=0,index只有一个位置是1,区分该位置是否为0或1:只有1&1=1。
a^=num;
}else{
b^=num;
}
}
System.out.println(a + "和" + b );
}
}
符号优先级
比如说:== 大于位运算符:
(a & 1) == 1 && (b & 1) == 1
优先级
运算符 | 结合性 |
---|---|
[ ] . ( ) (方法调用) | 从左向右 |
! ~ ++ – +(一元运算) -(一元运算) | 从右向左 |
* / % | 从左向右 |
+ - | 从左向右 |
> >>> | 从左向右 |
< >= instanceof | 从左向右 |
== != | 从左向右 |
& | 从左向右 |
^ | 从左向右 |
| | 从左向右 |
&& | 从左向右 |
|| | 从左向右 |
?: | 从右向左 |
= | 从右向左 |
常规运算结果
异或,(・∀・(・∀・(・∀・*):
0^0 = 0,
1^0 = 1,
0^1 = 1,
1^1 = 0
有符号右移>>和无符号右移>>>
java的位运算符有三种: >> , >>> , <<。没有有符号左移
。
对于右移,简单的说,无符号移动无论正负数都是“高(空缺)位”补0。有符号移动则是根据高位即符号位
,来补充空缺位。比如正数>> 则补0 , 负数>>则补1
对于正数
10 >> 1 或者 10 >>> 1
- 10的二进制表示:0000 0000 0000 0000 0000 0000 0000 1010
- 10右移一位为: 0000 0000 0000 0000 0000 0000 0000 0101(10进制的5)
对于负数
-10 >> 1 或者 -10 >>> 1
- -10的二进制表示:1111 1111 1111 1111 1111 1111 1111 0110
- -10右移一位为: 1111 1111 1111 1111 1111 1111 1111 1011(10进制的-5)
标签:10,0000,index,int,1111,操作符,左向右,java,移位 来源: https://blog.csdn.net/qq_37334150/article/details/122673514