public static void main(String[] args) {
System.out.println(sub(3, 12));
System.out.println(pow2(3, 6));
int a = 127;
System.out.println(Integer.toBinaryString(a));
System.out.println(num(a));
}
/**
* 不用递归实现乘方
* 如:3^27 = 3^(11011)=3^16 * 3^8 * 3^2 * 3^1
* @param a 底数
* @param p 指数
* @return 幂
*/
public static int pow2(int a, int p) {
int result = 1;//
int t = a;
while (p > 0) {
if ((p & 1) != 0)
result *= t;
p >>= 1;
t *= t;
}
return result;
}
/**
* 实现乘法
* @param a
* @param b
* @return
*/
public static int sub2(int a, int b) {
int sum = 0;
while (b > 0) {
if ((b & 1) == 1) {
sum += a;
}
b >>= 1;//计算高一位,除“10”
a <<= 1;//被乘数先乘“10”,方便加或不加进最后结果
}
return sum;
}
/**
* 只用加法和位移运算实现乘法
* 可优化
* @param a 第一个乘数
* @param b 第二个乘数
* @return 乘积
*/
public static int sub(int a, int b) {
int sum = 0;
int i = 0;
while (b > 0) {
if ((b & 1) == 1) {
sum += a << i;
}
b >>= 1;
i++;
}
return sum;
}
/**
* 不用递归实现乘方
* 此方法逻辑错误!@9.27
* @param a 底数
* @param b 指数
* @return 幂
*/
// public static int pow(int a, int b) {
// int sum = 1;
// while (b > 0) {
// if ((b & 1) == 0) {
// sum *= a;
// } else {
// sum = sum * sum;
// }
// b >>= 1;
// }
// return sum;
// }
/**
* 一个整数的二进制表示法中有多少位1
*
* @param a 整数
* @return
*/
public static int num(int a) {
int b = 0;
while (a > 0) {
if ((a & 1) == 1) {
b += 1;
}
a >>= 1;
}
return b;
}
while实现乘方,乘法,二进制数中的1个数
最新推荐文章于 2023-05-16 11:16:03 发布