或非和java的移位操作符

2022/1/24 20:04:51

本文主要是介绍或非和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)


这篇关于或非和java的移位操作符的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!


扫一扫关注最新编程教程