第一章:位运算

位运算

位运算与进制的基础

在这里插入图片描述在这里插入图片描述

相关题目的题解

题目1:
在这里插入图片描述
题解:

import java.util.Arrays;
import java.util.Random;
public class 找出唯一成对的数 {
    public static void main(String[] args) {
        int N = 1001;
        int[] arr = new int[N];
        for(int i=0;i<arr.length-1;i++)
        {
            arr[i]=i+1;
        }
        //最后一个数位随机数
        arr[arr.length-1] = (new Random().nextInt(N-1))+1;
        System.out.println(Arrays.toString(arr));
        int x1=0;
        for(int i=1;i<=N-1;i++)
        {
            x1 = (x1^i);
        }
        for(int i=0;i<arr.length;i++)
        {
            x1 = (x1^arr[i]);
        }
        System.out.println(x1);
    }

}

题目2:
在这里插入图片描述题解:

import java.util.Arrays;
import java.util.Random;
public class 找出落单的那个数 {
    public static void main(String[] args) {
        int[] arr = {1,1,2,2,3};
        int x1=0;
        for(int i=0;i<arr.length;i++)
        {
            x1 = (x1^arr[i]);
        }
        System.out.println("落单的数为:"+x1);
    }
}

题目3:

在这里插入图片描述题解:

第一种解法:

import java.util.Scanner;
public class 二进制中1的个数_第一种解法 {
    public static void main(String[] args) {

        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        //定义一个计数器
        int count=0;
        for(int i=0;i<32;i++)
        {
            if((N&(1<<i))==(1<<i)) count++;
        }
        System.out.println(Integer.toString(N,2));
        System.out.println("数"+N + "二进制形式中的1的个数为:" + count);
    }
}

第二种解法:

import java.util.Scanner;
public class 二进制中1的个数_第二种解法 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        System.out.println(Integer.toString(N,2));
        int num=N;
        //定义一个计数器
        int count=0;
        while(N!=0)
        {
            N=(N-1)&N;
            count++;
        }
        System.out.println("数"+num+ "二进制形式中的1的个数为:" + count);
    }
}

题目3:
在这里插入图片描述解法:

import java.util.Scanner;
public class 是不是2的整数次方 {
    public static void main(String[] args) {
        Scanner in = new Scanner(System.in);
        int N = in.nextInt();
        if(((N-1)&N)==0)
        {
            System.out.println("是2的整数次方");
        }else {
            System.out.println("不是2的整数次方");
        }

    }
}

题目4:

在这里插入图片描述解法:

public class 将整数的奇偶位互换 {
    public static void main(String[] args) {
       int a = 9;
       int b = m(a);
        System.out.println("整数的奇偶位交换之后的数为"+b);
    }
    static int m(int i)
    {
        int ou = i&0xaaaaaaaa;//与1010 1010....做与运算,保留偶数位
        int ji = i&0x55555555;//与0101 0101....做与运算,保留奇数位
        return ((ji<<1)^(ou>>1));//奇数位左移一位,偶数位右移一位
    }

}

题目5:
在这里插入图片描述

题目6:
在这里插入图片描述解法:
(1)解答本体的关键知识点是:K个相同的K进制数做不进位加法结果为0
(2)10进制转其他进制在java中调用现有的API,即Integer.toString(i,radix),具体用法参照java的API手册

package com.DJL.bitArithmetic;
public class 出现k次与出现1{

    public static void main(String[] args) {
        int[] arr = {2, 2, 2, 9, 7, 7, 7, 3, 3, 3, 6, 6, 6, 0, 0, 0};
        int k = 3;
        int len = arr.length;
        //存储arr数组中每个数的对应k进制字符串
        char[][] kradix = new char[len][];
        int maxLen = 0;
        //转成k进制字符数组
        //对于每一个数字
        for (int i = 0; i < len; i++) {
            //进行字符反转的原因是要保证每个k进制数的低位对齐
            kradix[i] = new StringBuilder(Integer.toString(arr[i], k)).reverse().toString().toCharArray();
            //求这些k进制数中位数最长的长度
            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 {
                    resArr[j] += (kradix[i][j] - '0');
                }
            }
        }
        int res = 0;
        for (int i = 0; i < resArr.length; i++) {
            res += (resArr[i] % 3) * Math.pow(k, i);
        }
        System.out.println("结果为:" + res);
    }

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值