二进制知识巩固和一些常用运算
一)判断一个数是奇数还是偶数
原理:本身和1进行按位与运算,奇数会等于1,偶数会等于0
public static void main(String[] args) {
// 判断一个数是奇数还是偶数
System.out.println(11&1); // 结果为1
System.out.println(10&1); // 结果为0
System.out.println(7&1); // 结果为1
System.out.println(6&1); // 结果为0
// 结论:本身和1进行按位与运算,奇数会等于1,偶数会等于0
}
二)用一条语句判断一个整数是不是2的整数次方
思路:一个整数如果是2的整数次方,那么它的二进制中有且仅有一个位是1,而其他所有位都是0,把该整数减去1后再与自己相与,唯一的1也会变成0
public static void main(String[] args) {
// n&(n-1)
System.out.println(16 & (16-1)); // 0
System.out.println(15 & (15-1)); // 14
System.out.println(14 & (14-1)); // 12
System.out.println(9 & (9-1)); // 8
System.out.println(8 & (8-1)); // 0
System.out.println(7 & (7-1)); // 6
}
三)统计一个二进制数中0或者1的数量
原理: 先把n转换成二进制,然后用按位与的方式与0或者1比较,在统计执行的次数,之后再进行无符号右移,去除一个最低位。
/**
* 按位与
* 计算“二进制中0或者1的个数”
* @param number
*/
public static void bitwiseAndOne(int n) {
int countZero = 0; // 统计0的个数
int countOne = 0; // 统计1的个数
while (n != 0) {
if ((n&1) != 1) {
countZero++;
}
if ((n&1) != 0) {
countOne++;
}
n = n>>>1;
}
System.out.println("十进制" + n + "中二进制0的数量为: " + countZero + "个");
System.out.println("十进制" + n + "中二进制1的数量为: " + countOne + "个");
}
/**
* 按位与(另一种思路)
* 计算“二进制中1的个数”
* @param number
*/
public static void bitwiseAndTwo(int n) {
int count = 0;
while (n != 0) {
// n&(n-1) 操作相当于把二进制表示中最右边的1变成0。
n = n & (n-1);
count++;
}
System.out.println("方式二: 十进制" + n + "中二进制1的数量为: " + count + "个");
}
四)输入两个整数m和n,计算需要改变n的多少位可以得到m
原理:首先需要对两个数进行异或操作,之后通过统计二进制1的个数,就是改变的位数。
public static void main(String[] args) {
/**
8的二进制: 0000 1000
7的二进制: 0000 0111
异或之后的二进制: 0000 1111
*/
count(8, 7);
}
/**
* 输入两个整数m和n,计算需要改变n的几位可以得到m
*/
public static void count(int m, int n) {
// 先把两个数异或
int num = m^n;
System.out.println("异或之后的, num=" + num);
// 统计1的个数,就是需要改变n几位可以得到m
int count = 0;
while (num != 0) {
if ((n&1) != 0) {
count++;
}
num = num >>> 1;
}
System.out.println("异或之后统计的1的数量, count=" + count);
}
五)不用加减乘除做加法
原理:二进制每位相加就相当于各位做异或操作
再计算进位值,相当于各位做与操作,再向左移一位
备注:各位的意思是说,二进制每一位都需要进行运算。
/**
* 不用加减乘除做加法
* @param num1
* @param num2
* @return
*/
public static int sumCalc(int num1, int num2) {
if (num1==0 && num2==0) {
return 0;
} else if(num1==0) {
return num2;
} else if(num2==0) {
return num1;
}
int sum = 0;
int array;
while (num2 != 0) {
sum = num1 ^ num2; // 异或
array = (num1 & num2) << 1; // 按位与,再左移1位
num1 = sum;
num2 = array;
}
return num1;
}
识别二维码关注个人微信公众号
本章完结,待续,欢迎转载!
本文说明:该文章属于原创,如需转载,请标明文章转载来源!