位运算
位运算与进制的基础
相关题目的题解
题目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);
}
}