位运算的奇巧淫技例题补充

例题5:0-1间浮点实数的的二进制表示

给定一个介于0-1之间的实数,(如0.625),类型为double,打印它的二进制表示。如果该数字无法精确的用32位以内的二进制表示则打印“ERROR”。

public class 二进制小数 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
       double num = 0.625;
 
       StringBuilder sb = new StringBuilder("0.");
       while(num>0) {
    	   double r = num*2;
    	   if(r>=1) {
    		   sb.append("1");
    		   num=r-1;
    	   }
    	   else {
    		   sb.append("0");
    		   num=r;
    	   }
    	   if(sb.length()>34) {
    		   System.out.println("ERROR");
    	       return;
    	   }
       }
       System.out.println(sb.toString());
	}

}

例题六:出现K次与出现一次

数组中只有一个数出现一次,其他的数都出现了K次,请输出只出现了一次的数。

题意理解:首先,我们要知道两个相同的二进制数做不进位加法,结果为0;

                      10个相同的10进制数做不进位加法,结果为0;

                       K个相同的K进制数做不进位加法,结果为0.

public class 出现K次 {

	public static void main(String[] args) {
		// TODO Auto-generated method stub
        int[] arr = {2,2,2,9,7,7,7,3,3,3,6,6,6,0,0,0};//用于测试的数组
        int len = arr.length;
        char[][] kRadix = new char[len][];//定义一个二维数组用来存放每个数的3进制表示
        int k = 3;//重复出现的次数
        
        int maxLen = 0;//一个数转成3进制字符数组后最大的长度
        //把每个数转化成3进制:这里用二维字符数组存放,因为后面要做不进位加法,所以通过把得到的3进制字符串给翻转,使得个十百等每一位对齐。
        for(int i =0;i<len;i++) {
        	kRadix[i] = new StringBuffer(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
            //找到最大的长度
        	if(kRadix[i].length>maxLen) {
        		maxLen = kRadix[i].length;
        	}
        }
        //用来存放做不进位后每一位的值
        int resArr[] = new int[maxLen];
        //求每一位的和
        for(int i = 0; i <len;i++) {
        	for(int j =0;j<maxLen;j++) {
        		if(j>=kRadix[i].length) {
        			resArr[j] += 0;
        		}
        		else {
        			//字符在进行加减运算的时候按照ASCALL编码转换成了数值
        			resArr[j] += kRadix[i][j]; 
        		}
        	}
        }
        
        int res = 0;
        for(int i=0;i<maxLen;i++) {
        	res += ((resArr[i]%k) * (int)(Math.pow(k, i)));
        }
        System.out.println(res);
	}

}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值