2进制,位运算 a&(a-1) == 0.
在二进制数中,若2的k次方等于n,则n只有最高位为1,其他位为0,故(n-1)的最高位为0(相对于n来说),其他位为1,
因此判断一个数是否是2的幂,只需判断n & (n-1)是否为0,若为0,则是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即可。
(1<<31)-1);//2147483647
~(1<<31);//<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2147483647</span>
1<<31;//-<span style="font-family: Arial, 'Hiragino Sans GB', STHeiti, 'Microsoft YaHei', simsun, sans-serif;">2147483648</span>
n<<1;//乘以2
n>>2;//除以2
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>
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>
n&1==1
private void swap(int a, int b) { a ^= b; b ^= a; a ^= b; ... }a^=b等价于a = a^b,其中^是位异或运算,即将a与b的对应位进行异或运算,同为0或者同为1时,对应位结果为0;否则为1。
char[] numbers = Integer.toBinaryString(random).toCharArray();
x^y>0;//符号相同大于0,相反小于0