喜迎
春节

two


02. 位运算的巧妙

两个数异或,相同为0,不同为1.

7 0111

13 1101

两个数异或 等于 1010

有一种简便算法,异或运算又可以叫做无进位相加

二进制相加,不进为,即在同一位置上时,有偶数个1,结果就为0,有奇数个1,结果就为1 ,合并起来,就是异或的结果。

性质: 0^n = n n^n = 0 记无进位相加就好了。

1.不新增变量的情况下交换两个数的值

新增变量的方法

int tmp = a ;
a = b;
b = tmp ;

不用新增变量

int a = 105 ;
int b = 85 ;

a = a ^ b ;
b = a ^ b ; // b = a^b^b=a^0=a
a = a ^ b ; // a = a^b^a=0^b=b

// 这样就把两个数交换了。
// 需要注意的是,如果 a,b指向通一个位置,这样写是会报错的。
// 自己新手解读那不要用,知道就可以了。

2. 数组中,只有一种数出现了奇数次,其他都出现了偶数次找到他。

public static void printOddTimesNum1(int[] arr){
        int ero = 0 ;
        for(int i = 0; i < arr.length; i ++){
            ero ^= arr[i] ;
        }
        System.out.println(ero);
    }
//看下面的举例,for循环累计异或,偶数个相同的数异或为0,只有最后那个奇数个的数异或最后的值为它,所以可以这样用这个值来解

3. 怎么把一个int类型的数,提取出最右侧的1来

二进制中的最右侧的1.

// 看图可以得知,将a取反加1 ,即可取出最右侧的1
// a取反加1 = -a 
int a = 134 ;
int res = a & (-a)  ;
res // 为最右侧的一 ;

4.一个数组中有两种数出现了奇数次,其他数都出现了偶数次,怎么找到并打印这两种数。


文章作者: ljhaa
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 ljhaa !
评 论
 上一篇
python笔记
python笔记
前言,本篇是同学建议,将之前学习python的笔记整理了一下,方便重修的同学参考。记得很清楚,当时python编程基础这门课,不算平时分,只算试卷成绩的话,自己几乎满分,我记得是95还是94来着,因为有一题调用api的,调用的是isdigi
2023-04-19
下一篇 
one
one
01.排序01Class1. 选择排序假定一个最小的数,是起始位置的,如果发现后面的数中有比这个数小的数,就交换位置,这时还没有结束,第一层循环还是在第一个位置,直到找到最小的一个数,将其交换位置,放到最开始的位置,依次类推,第二小的就放在
2023-04-18
  目录