位运算

位运算算法总结

  • 位运算符:
    &(与):两者都为1才为1
    |(或):有一个是1就是1
    ~(非):取反
    ^(异或):两者不同才为1

(完成)交换x,y的值(不使用中间值tmp)

法一:
x = x+y;//有可能越界
y = x-y;
x = x-y;

法二:
x = x^y;//x被y异或两次还等于x本身
y = x^y;
x = x^y;

(完成)二进制中1的个数

                /*题目描述
                输入一个整数,输出该数二进制表示中1的个数。其中负数用补码表示*/
public class Solution_11 {
    /*public static int NumberOf1(int n) {
        int count = 0;
        int flag = 1;
        while(flag != 0){       //这个方法循环了32次
            if((n & flag)!=0)   //说明末尾是1
                count++;
            flag = flag << 1;   //在这里控制的是flag而不是n 因为我不能确定n是否是负数  是负数的话会造成死循环 0xffffffff
        }  
        return count;
    }*/
    public static int NumberOf1(int n) {
        int count = 0;
        while(n!=0){
            count ++;
            n = n&(n-1);    //一个数按位与这个数减1    就相当于把最右边的1位变成0     因此这个方法更精妙 有几个1位就只需循环几次
        }
        return count;
    }
}

判断一个数是否为2的n次幂

package yanyingnan.baodian.bit;
/*判断一个数是否为2的n次幂*/
public class Solution_01 {
    /*public static boolean is2n(int n){
        if(n<1)
            return false;
        int i=1;
        while(i<=n){
            if(n==i)
                return true;
            i<<=1;          //操控i,不断地使i左移
        }
        return false;
    }*/
    public static boolean is2n(int n){
        if(n<1)
            return false;
        return (n&(n-1)) == 0;//一个数按位与这个数减1      就相当于把最右边的1位变成0 
    }
    public static void main(String[] args) {
        System.out.println(is2n(8));
    }
}

求两个整数之和

package neu.yanyingnan.offer;
            /*题目描述
            写一个函数,求两个整数之和,要求在函数体内不得使用+、-、*、/四则运算符号。*/
public class Solution_48 {
    public int Add(int num1,int num2) {
        if(num2 == 0)
            return num1;
        int sum;
        int carry;
        sum = num1 ^ num2;//第一步: 直接相加不进位 相当于 异或
        carry = (num1 & num2) << 1;//第二步 :计算出要进位的那些位   &表示两个一才进位  << 表示向前进位
        return Add(sum, carry);//第三步:一二步的结果进行递归   直到num2==0 就是结果了
    }
}

求1+2+3+…+n

package neu.yanyingnan.offer;
            /*题目描述
            求1+2+3+...+n,
            要求不能使用乘除法、forwhileifelseswitch、case等关键字及条件判断语句(A?B:C)。*/
public class Solution_47qqqqq {
    public int Sum_Solution(int n) {
        return (int)Math.pow(n, 2)+n >> 1;//(n^2+n)/2
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值