
异或:不同时为1,可以理解为不进位的加法
功能
判断奇偶:
n&1==1 为奇数
用异或进行两数交换
x=x^y
y=x^y
x=x^y
原理:异或,两个相同的数异或为0.任何数与0异或等于本身。(异或运算支持交换律和结合律)
用异或找出没有重复的数
给你一组整型数据,这些数据中,其中有一个数只出现了一次,其他的数都出现了两次,让你来找出一个数 。
1, 2, 3, 4, 5, 1, 2, 3, 4。对所有数进行异或
123451234 = (11)(22)(33)(44)5= 00005 = 5。
int find(int[] arr){
int tmp = arr[0];
for(int i = 1;i < arr.length; i++){
tmp = tmp ^ arr[i];
}
return tmp;
}
用异或找到重复的数
1到5中有重复的数,找他:
int a[]= {1,2,3,4,3,5};int x=1^2^3^4^5;
int newx;
for(int i=0;i<a.length;i++)
{
x^=a[i];
}
System.out.println(x);
m的n次方
为快速矩阵幂
int pow(int n){
int sum = 1;
int tmp = m;
while(n != 0){
if(n & 1 == 1){
sum *= tmp;
}
tmp *= tmp;
n = n >> 1;
}
return sum;
}
位运算求整数的绝对值
public int abs( int a ) {
return (a + (a >> 31)) ^ (a >> 31) ;
}
与判断二进制中1的个数
public class 位运算判断二进制中1的个数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int n=14;//1110
int ans=0;
for(int i=0;i<32;i++)
{
if((n&1<<i)==(1<<i))ans++;
}
System.out.println(ans);
}
}
与运算判断是不是2的整次幂
int n=64;
if(((n-1)&n)==0) System.out.println("yes");
用二进制表示浮点数
public class 用二进制表示浮点数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
StringBuilder ans=new StringBuilder("0.");
double x=0.625;
while(x>0)
{
x*=2;
if(x>=1)
{
ans.append(1);
x-=1;
}
else {
ans.append(1);
}
if(ans.length()>34)
{
System.out.println("ERROR 无法形成二进制");System.exit(1);
}
}
System.out.println(ans);
}
}
出现k次和1次找出1次的数
package 算法训练;
//2021年3月28日上午12:26:09
//writer:apple
public class 出现k次和1次找出1次的数 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a[]= {1,1,1,2,2,2,3,3,3,4};
int k=3;
char kradix[][]=new char[a.length][];
int maxlen=0;
for(int i=0;i<a.length;i++)
{
//将a[i]转成k进制,为了方便后面的异或运算,反转字符,再转成字符类型。
kradix[i]=new StringBuilder(Integer.toString(a[i],k)).reverse().toString().toCharArray();
maxlen=Math.max(maxlen,kradix[i].length);
}
int ansarr[]=new int[maxlen];//存放最后数的k进制形式
for(int i=0;i<kradix.length;i++)
{
for(int j=0;j<maxlen;j++)
{
if(j>=kradix[i].length) {
ansarr[j]+=0;
}
else {
ansarr[j]+=(kradix[i][j]-'0');
}
}
}
int ans=0;
for(int i=0;i<maxlen;i++)
{
ans+=(ansarr[i]%k*Math.pow(k, i));
}
System.out.println(ans);
}
}
本文介绍了位运算是如何在编程中用于解决各种问题的,包括判断奇偶、实现无额外空间的两数交换、找出数组中只出现一次的数、判断是否为2的整次幂以及求浮点数的二进制表示。此外,还展示了如何利用位运算快速求解整数的绝对值以及在特定场景下寻找出现k次和1次的数的方法。
771

被折叠的 条评论
为什么被折叠?



