问题1:
2进制,位运算 a&(a-1) == 0.
在二进制数中,若2的k次方等于n,则n只有最高位为1,其他位为0,故(n-1)的最高位为0(相对于n来说),其他位为1,
因此判断一个数是否是2的幂,只需判断n & (n-1)是否为0,若为0,则是2的幂,否则,不是2的幂。
问题2:
计算器出错:把所有的‘0’都变成了‘*’,而且不能智能的消除小数点数字后多余的0, 比如100.00100写成了1**.**1**,现在要求编程序转换回来,并消除小数点后多余的零。
如输入:1.**1** ;输出:1.001
private String castNumber(String num) {
boolean isDivide = false;
char[] bytes = num.toCharArray();
for (int i = 0; i< bytes.length; i++) {
if ((bytes[i] == '.')) {
isDivide = true;
}
if(bytes[i] == '*') {
bytes[i] = '0';
}
}
if (isDivide) {
int numberOfZero = 0;
int offset = bytes.length - 1;
while (bytes[offset] == '0' || bytes[offset] == '.') {
numberOfZero++;
offset--;
}
char[] cast = new char[bytes.length - numberOfZero];
System.arraycopy(bytes, 0, cast, 0, cast.length);
return new String(cast);
}
return new String(bytes);
}
其他思想:首先判断str的数是否是小数,如果不是则将str的‘*’全部替换为‘0’即可,如果是,从str的末尾开始遍历,首先将遇到的‘*’全部剔除,下一步如果遇到'.',则将'.'也剔除,否则将从这一位到str[0]的所有字符为'*'的用‘0’代替,输出str即可。
问题3:
1.获得int型最大值:
(1<<31)-1);//2147483647
~(1<<31);//<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2147483647</span>
2.获得int型最小值:
1<<31;//-<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2147483648</span>
3.乘以2:
n<<1;//乘以2
4.除以2:
n>>2;//除以2
5.乘以2的m次幂:
n<<m;//<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">乘以</span><span style="line-height: 2em; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2的m次幂</span>
6.除以2的m次幂:
n>>m;//<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">除以</span><span style="line-height: 2em; font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2的m次幂</span>
7.判断一个数的奇偶性:
n&1==1
8.不用临时变量交换两个数:
private void swap(int a, int b) {
a ^= b;
b ^= a;
a ^= b;
...
}
a^=b等价于a = a^b,其中^是位异或运算,即将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0;否则为1。
9.int到数组
char[] numbers = Integer.toBinaryString(random).toCharArray();
10.判断符号是否相同
x^y>0;//符号相同大于0,相反小于0