java 位运算 从入门到入坑 完整版

本文介绍了位运算是如何在编程中用于解决各种问题的,包括判断奇偶、实现无额外空间的两数交换、找出数组中只出现一次的数、判断是否为2的整次幂以及求浮点数的二进制表示。此外,还展示了如何利用位运算快速求解整数的绝对值以及在特定场景下寻找出现k次和1次的数的方法。

在这里插入图片描述
异或:不同时为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 = 5int 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);
	}
}
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值