package newpackage;
public class WeiYunSuan {
/**
* 这题主要考查的是整型数据在内存的机器码的问题,通过短除法来求1的个数 另外java中的&运算 正数:就是原码,
* 负数:补码,要注重符号位之后补1的操作
*/
public int NumberOf1(int n) {
int a = n;
int count = 0;
if (n >= 0) {
while (a != 0) {
if (a % 2 == 1)
count++;
a = a / 2;
}
} else {
int i = 0;
count = 1;
while (a % 2 == 0) {
a = a / 2;
i++;
}
if (a != -1)
count++;
while (a != 0) {
if (a % 2 == 0)
count++;
a = a / 2;
i++;
}
for (; i <= 31; i++)
count++;
}
return count;
}
/**
* 通过java的位运算也是可以解决,整型二进制中1的个数的问题的
* 其中的正数是用原码存放的
* 负数直接就是用补码存放的了,不用再通过短除法的一个转化了
* @param n
* @return
*/
public static int NumberOf1two(int n) {
int count = 0;
int a = 1;
for (int i = 0; i < 32; i++) {
if ((n & a) == 1) {
count++;
System.out.print(1);
} else {
System.out.print(0);
}
n = n >> 1;
}
return count;
}
/**
* java中的位运算验证程序
* 由此可见java中的移位运算并不是循环移位,(跟以前碰到的一个程序有点出入)
*/
private static void weiyunsuan() {
// 1、左移( << )
// 0000 0000 0000 0000 0000 0000 0000 0101 然后左移2位后,低位补0://
// 0000 0000 0000 0000 0000 0000 0001 0100 换算成10进制为20
System.out.println(5 << 2);// 运行结果是20
// 2、右移( >> ) 高位补符号位
// 0000 0000 0000 0000 0000 0000 0000 0101 然后右移2位,高位补0:
// 0000 0000 0000 0000 0000 0000 0000 0001
System.out.println(5 >> 2);// 运行结果是1
// 3、无符号右移( >>> ) 高位补0
// 例如 -5换算成二进制后为:0101 取反加1为1011
// 1111 1111 1111 1111 1111 1111 1111 1011
// 我们分别对5进行右移3位、 -5进行右移3位和无符号右移3位:
System.out.println(5 >> 3);// 结果是0
System.out.println(-5 >> 3);// 结果是-1
System.out.println(-5 >>> 3);// 结果是536870911
// 4、位与( & )
// 位与:第一个操作数的的第n位于第二个操作数的第n位如果都是1,那么结果的第n为也为1,否则为0
System.out.println(5 & 3);// 结果为1
System.out.println(4 & 1);// 结果为0
// 5、位或( | )
// 第一个操作数的的第n位于第二个操作数的第n位 只要有一个是1,那么结果的第n为也为1,否则为0
System.out.println(5 | 3);// 结果为7
// 6、位异或( ^ )
// 第一个操作数的的第n位于第二个操作数的第n位 相反,那么结果的第n为也为1,否则为0
System.out.println(5 ^ 3);// 结果为6
// 7、位非( ~ )
// 操作数的第n位为1,那么结果的第n位为0,反之。
System.out.println(~5);// 结果为-6
}
/**
* -32带符号右移32位之后还是-32,并不是因为java中的>>是循环右移
* 而是a >> x 相当于a >> (x % 32) 相对于整型来说
* b = 1; b >> y 相当于a >> (y % 64) 相对于长整型来说
*/
public static void xunhuanyiwei() {
int num = -32;
System.out.println(num >> 32);
}
}
需要注意的是:
java中的移位运算,一个整型 a>>32的结果还是a
这是因为int a = 1; a >> x 相当于a >> (x % 32),long b = 1; b >> y 相当于a >> (y % 64)
程序内部会自动对移动的位数进行取余操作