一颗旋转的螺丝钉

楠竹三年只培根 一朝飞跃莫等闲

位运算

位运算算法总结

  • 位运算符:

&(与):两者都为1才为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;

2.二进制中1的个数

package neu.yanyingnan.offer;
                /*题目描述
                输入一个整数,输出该数二进制表示中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;
    }
    public static void main(String[] args){
        //System.out.println(0xffffffff);
        System.out.println(NumberOf1(-7));//负数是以补码形式存的  所以输出位 30
    }
}

3. 判断一个数是否为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));
    }
}

4. 求两个整数之和

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 就是结果了
    }
}

5. 求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
    }
}
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yanyingnan1357/article/details/80338287
个人分类: 面试手册 算法
想对作者说点什么? 我来说一句

c++位运算c++位运算

2011年08月02日 63KB 下载

java位运算.docx

2011年10月26日 50KB 下载

c语言位运算c语言位运算

2010年03月10日 38KB 下载

C语言位运算

2011年10月24日 205KB 下载

Java 中的位运算 .doc

2009年03月04日 109KB 下载

没有更多推荐了,返回首页

不良信息举报

位运算

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭