位运算的技巧

目录

1. 判断奇偶数

2.用来求二进制

3.交换两个数的值

4. 取绝对值

5. 统计一个数的二进制形式中1的个数

6.判断一个数是不是2的次方

7. 奇偶位互换

8.让浮点数转化为二进制

9.k个k进制的不进位加法为0


 

 

 

 

&  按位与            |  或               ^ 异或              ~取非

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

有时间再更新吧!

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值