与0相与是消散
与1相与是保留
从左往右数还是从右往左数是一样的为了奇偶交换 此处就从左往右数了)
c为保留偶数位
d为保留奇数位
c往左移1位 d往右移1位 相异或
A与1相异或 为~A
A与0相异或为A
public class 整数的奇偶互换 {
public static void main(String[] args) {
// TODO Auto-generated method stub
int a =0b00000000_00000000_00000000_11111001;
int b =f(a);
System.out.println(b);
System.out.println(Integer.toString(b,2));//转为二进制
}
private static int f(int num) {
int a = 0xaaaaaaaa;//1010 1010...
int b = 0x55555555;//0101 0101...
return ((num&a)>>>1)^((num&b)<<1);
}
}
整数10进制转2进制是
除以2 取余 留商...
小数10进制转2进制是
乘2 判断整数位 扣掉整数位 ...
public class 二级制表示 {
public static void main(String[] args) {
System.out.println(f(0.625d));
}
private static String f(double num) {
StringBuilder sb = new StringBuilder("0.");
while(num>0) {
//乘2
double r = num*2;
//判断整数部分
if(r>=1) {
//拼接
sb.append("1");
//消掉整数部分
num = r-1;
}else {
sb.append("0");
num = r;
}
if(sb.length()>34) {//这里题没讲清楚 不包含0.为34 ,包含32
System.out.println("ERROR");
return "";
}
}
return sb.toString();
}
}
>>>0.101
package impo.位运算;
public class 出现k次与出现1次{
/**
* 2 2
* 2 2
* 2 2
* 3 0 1
* 4 1 1
* 4 1 1
* 4 1 1
*/
public static void main(String args[]) {
int [] arr =new int []{1,2,3,2,3,2,3,4,4,4,1,1,6};
int len = arr.length;
char [][] kRadix = new char[len][];//二维数组 每一行为每个数字转为k进制的每一位
int k = 3;//出现了三次 转为三进制
int maxlen = 0;
//转为k进制字符数组
//对于每个数字
for(int i=0;i<arr.length;i++) {
//求每个数字的三进制字符串并翻转,然后转为字符串
kRadix[i]=new StringBuilder(Integer.toString(arr[i],k)).reverse().toString().toCharArray();
//一个数字 它的三进制字符数组的长度如果大于maxlen 就更新一下
if(kRadix[i].length>maxlen) {
maxlen = kRadix[i].length;//每一行存arr数组的值的三进制转换后并反转的字符数组
//之所以反转 为了对齐低位好进行不进位运算
}
}
//不进位加法
//最终resArr数组中值为 对应行上 所有位 的和
int [] resArr = new int[maxlen];
for(int i=0;i<len;i++) {//行
for(int j=0;j<maxlen;j++) {//列
if(j>=kRadix[i].length) {
resArr[j] +=0;//就是j大于当前这一行数组的长度(即maxlen大于这行数组的长度,空的就为0) 累加的时候就加0
}else{
resArr[j] +=kRadix[i][j]-'0';//char类型转为int
}
}
}
//k进制转为10进制
int res = 0;
for(int i=0;i<maxlen;i++) {
res += (resArr[i]%k)*(int)Math.pow(k, i);//k为3,第一位上i为0 第二位上i为1 第三位上i为2
}
System.out.println(res);
}
}
2个相同的2进制数做不进位加法 ,结果为0
10个相同的10进制数做不进位加法 ,结果为0
k个相同的k进制数做不进位加法 ,结果为0
巧秒解法
所有数先转为K进制 做K进制的不进位加法 剩下就是我们要的答案的K进制 再转回来
10进制转其他进制方法
网友评论