位运算的巧妙运用

1:位运算的符号

与运算:&

或运算:|

异或运算:^

非运算:~

移位运算:>>和<<


1:判断一个数是否是2的N次方

   题目要求:用一个表达式,判断一个数x是否是2的N次方,既2,4,8,16....,要求不可以用循环语句:

   分析:2,4,8,16这样的数转换成二进制是10,100,1000,10000.

            如果x减去1的二进制是01,011,0111,01111.这个时候与x做与运算,答案若为0,则x是2的N次方。

           所以答案是:

  public static void check2nNum(int num) {
        if ((num & (num - 1)) == 0) {
            System.out.println("num:" + num + " 2ncifangf");
        }
    }

2:两个数交换

     题目要求:将a,b两个数的值进行交互,并且不使用任何中间变量

    方式1:

    

public static void exchangeAB(int a,int b)
    {
        System.out.println(String.format("exchange before:a:%d;b%d",a,b));
        a=a+b;
        b=a-b;
        a=a-b;
        System.out.println(String.format("exchange after:a:%d;b%d",a,b));
    }

      方式2:

      异或运算:相同为0,相异为1

  

   /**
     *  1,3
     * @param a
     * @param b
     */
    public static void exchangeAB2(int a,int b)
    {
        System.out.println(String.format("exchange before:a:%d;b%d",a,b));
        a=a^b;   
        b=a^b;
        a=a^b;
        System.out.println(String.format("exchange after:a:%d;b%d",a,b));
    }


解释:

   如1,3

   a=(01^11)=(10)=3;

   b=(11^01)=(01)=1;

   a=(10^01)=(10)=3;



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

亚洲小炫风

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值