• 【基础算法】位运算-基本运算


    上一篇中我们分析了位的定义,这一篇中我们分析一下位的基本运算

    1. 移动

    左移n位:乘以2的n次方

    右移n位:除以2的n次方

    (~0)左移n位:在1后面加上n个0 (注:~0不等于1。等于11…11)

    x&(~0<<n):将最右边的n位清零

    正数左移右边补0

    正数右移左边补0

    负数左移右边补1

    负数右移左边补1


    移动的作用总结:乘2,除2。右n位清零


    2. 异或

    x^0=x

    x^x=0

    x^1=~x

    x^~x=1


    异或的作用总结:取数,清零,取非,清1


    3. 且运算

    x&0=0

    x&1=x

    x&x=x


    且运算的作用总结:位清零,位取数,取数


    4. 或运算

    x|0=x

    x|1=1

    x|x=x


    或运算的作用总结:位清1,取数。


    5. 取位

    先把1左移i位

    再把num与i做“与运算”

    假设是0返回0,否则返回1

    	public static int getBit(int num, int i) {
    		i = (1 << i);
    		num = num & i;
    		if (num == 0)
    			return 0;
    		return 1;
    	}
    
    也能够直接把这个数右移i位后和1做与运算

    	public static int getBit2(int num, int i) {
    		return (num>>i)&1;
    	}
    

    6. 设位

    设置第i位的方法:X|00000010 (i=1)

    	public static int setBit(int num, int i) {
    		i = 1 << i;
    		return num | i;
    	}
    


    7. 清位

    把第i位清0的方法

    	public static int clearBit(int num, int i) {
    		i = 1 << i;
    		i = ~i;
    		num = num & i;
    		return num;
    	}
    

    把最左边位到i位都清0的方法

    	public static int clearBitLtoI(int num, int i) {
    		i = 1 << i + 1;
    		i = i - 1;
    		num = num & i;
    		return num;
    	}
    

    把第i位到第1位都清0的方法

    	public static int clearBitItoR(int num, int i) {
    		i = 1 << i + 1;
    		i = i - 1;
    		i = ~i;
    		num = num & i;
    		return num;
    	}
    

    8. 更新位

    步骤:清位+设位

    	public static int updateBit(int num, int i, int w) {
    		int temp = ~(1 << i);
    		num = num & temp;
    		w = w << i;
    		num = num | w;
    		return num;
    	}
    

    以上8种基本运算很重要。每一位想要掌握位运算的朋友,上面的基本运算都须要很熟练的掌握


  • 相关阅读:
    String空格删除和java删除字符串最后一个字符的几种方法
    Ceph 12.2.0 实践osd 智能分组功能
    Ceph 12.2.0 实践osd 智能分组功能
    Ceph 12.2.0 实践osd 智能分组功能
    Ceph 12.2.0 实践osd 智能分组功能
    取区域/扇区边界点
    取区域/扇区边界点
    取区域/扇区边界点
    取区域/扇区边界点
    解决客户端向服务器数据库传输中文乱码的方法
  • 原文地址:https://www.cnblogs.com/llguanli/p/8456950.html
Copyright © 2020-2023  润新知