基础:位运算符 &(与) |(或) ~(取反) ^(异或) >> <<(左移和右移)
1.n&(n-1) 消除数字二进制最低位的1
在二进制表示中,数字 nnn 中最低位的 111 总是对应 n−1n - 1n−1 中的 000 。因此,将 nnn 和 n−1n - 1n−1 与运算总是能把 nnn 中最低位的 111 变成 000 ,并保持其他位不变。
题目:Letcode 191
https://leetcode-cn.com/problems/number-of-1-bits/solution/wei-1de-ge-shu-by-leetcode/
计算一个二进制数中有多少个1 那么我们就很简单的写出答案
int sum = 0; while (n != 0) { sum++; n &= (n - 1); }
2.n&1 判断奇偶性
我们现在假设有一个数字 k 其 可以转换成 nnn0 或者是 nnn1 (n代表n或者1无伤大雅)
还是根据其二进制的特性0001 nnn1 或者 nnn0 前面都是 所以与这个数字奇偶性并没有直接的关系
那么我们根据最后一位交并的关系就可以得出来最后这个数字是奇函数还是偶函数
3.^求出额外的字符或者出现单数次的数字
原理:n^n =0
这就是找出s和k字符串中唯一的不相同的字符
注意这种算法只能计算出唯一一个不同的时候才能有效
public char findTheDifference(String s, String t) { int temp=0; for(char k : s.toCharArray()) temp^=k; for(char k:t.toCharArray()) temp^=k; return (char)temp; }
4.lowbit函数
lowbit是用于树状数组中极其重要的一种函数 其主要的作用是用来计算出
数字x的最低位1所在的位置 例如: 1100(十进制为12)lowbit(12)就是
int lowbit(int x) { return x&(-x); }
原理是负数是正数取反加一
x:1100
-x:1100 0011 0100
x&(-x):0100