目录
& 按位与 | 或 ^ 异或 ~取非
1. 判断奇偶数
n&1结果等于1,就是奇数,否之,则为偶数。
2.用来求二进制
思路就是:让n的每一位和1进行&运算。
for(i=0;i<8;i++) {
if((n&j)>0) {
s+='1';
}
else {
s+='0';
}
j<<=1;
}
System.out.println(new StringBuffer(s).reverse().toString());
3.交换两个数的值
主要用到的知识点:n^n=0 (异或:相异为1,相同为0)
a=a^b;
b=a^b; //b=a^b^b(把a=a^b代入)=a^0=a;
a=a^b; //a=a^b^b(这时b已经变成a了) =a^b^a =b
4. 取绝对值
分析:假如负数为-13
原码 0000 0000 0000 0000 0000 0000 1000 1101
反码 1111 1111 1111 1111 1111 1111 1111 0010
补码 1111 1111 1111 1111 1111 1111 1111 0011
~ 0000 0000 0000 0000 0000 0000 0000 1100
+1 0000 0000 0000 0000 0000 0000 0000 1101(13)发现-13的补码取反+1就是13,所以一个负数n的绝对值为 :~n+1 (可能你看到这有点疑惑,负数在计算机中是以补码形式存储的)。
但是这种方式只能取9位数,超过就会报错,有兴趣可以测试下。
5. 统计一个数的二进制形式中1的个数
基本思想:n&(n-1) 直到n为0, 记录&运算的次数。
int cnt=0;
while(a!=0) {
a=a&(a-1);
cnt++;
}
System.out.println(cnt);
6.判断一个数是不是2的次方
假设在int型4字节内32位,令一个数t为1;
让待判断的数和t进行与运算,若结果等于t,则是,退出循环;否之,t左移一位。
int a,b,i,j=1,n;
a=in.nextInt();
for(i=0;i<32;i++) {
if((a&j)==j) {
System.out.print("Yes");
break;
}
else {
j<<=1;
}
}
7. 奇偶位互换
在32位四字节内,首先要获得奇数位的数值和偶数位的数值。
获得奇数位
让Ox55555555跟n进行与运算,便可得到奇数位。
偶数位道理同上。
OxAAAAAAAA & n
然后让奇数位左移一位,偶数位右移一位。
再相加。
System.out.println(Integer.toString(a, 2));
ji=a&0x55555555;
ou=a&0xaaaaaaaa;
a=(ji<<1)^(ou>>1);
System.out.println(Integer.toString(a, 2));
8.让浮点数转化为二进制
public class double_two_radix {
public static String Double_two(double t) {
String s=".";
int i,j;
while(t!=0.0) {
t*=2;
if(t>=1.0) {
s+='1';
t%=1;
}
else {
s+='0';
}
}
return s;
}
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner in=new Scanner(System.in);
int i,j,t;
double d,a,b;
d=in.nextDouble();
if(d<1.0)
System.out.println("0"+Double_two(d));
else
System.out.println(Integer.toString((int)(d-d%1),2)+Double_two(d%1));
}
}
9.k个k进制的不进位加法为0
有时间再更新吧!