zoukankan      html  css  js  c++  java
  • 位运算

    位运算

    口诀

    位运算应用口位运算应用口诀位运算应用口诀

    清零取反要用与,某位置一可用或

    若要取反和交换,轻轻松松用异或

    运算规则

    1. 按位与&

    如果两个相应的二进位都为1,则该位的结果为1,否则为0;

    2. 按位或|

    两个对应的二进制只要有1,该位结果值为1

    3. 异或运算^

    相同为0,不同为1

    4. 异或的两个原理:

    两个相同的数异或运算的结果为:0

    某数与0异或运算,结果为自身.

    移位运算

    要点 1:它们都是双目运算符,两个运算分量都是整形,结果也是整形

    2 " >>"右移:右边的位被挤掉。对于左边移出的空位,如果是正数则空位补0,若为负数,可能补0或补1,这取决于所用的计算机系统

    num<<2 相当于 num*4,num>>2 相当于num/4

    4 ">>>"运算符,右边的位被挤掉,对于左边移出的空位一概补上0
    位运算符的应用

    无符号位移当需要移位的是正数时,与有符号位移一致

    按位与&

    清零特定位 (mask中特定位置0,其它位为1,s=s&mask)

    例子:

    //例如把a 的高八位清 0 , 保留低八位
    a&255//255为(0000000011111111)
    
    //Java中HashTable中的应用,0x7FFFFFFF为int最大值,首位为0其他都是1,用以保证hash & 0x7FFFFFFF必定为整数
    int index = (hash & 0x7FFFFFFF) % tab.length;
    
    

    取某数中指定位 (mask中特定位置1,其它位为0,s=s&mask)

    例子:

    //位掩码应用,利用位掩码可以用来管理权限
    public class NewPermission {
    	// 是否允许查询,二进制第1位,0表示否,1表示是
    	public static final int ALLOW_SELECT = 1 << 0; // 0001
    	
    	// 是否允许新增,二进制第2位,0表示否,1表示是
    	public static final int ALLOW_INSERT = 1 << 1; // 0010
    	
    	// 是否允许修改,二进制第3位,0表示否,1表示是
    	public static final int ALLOW_UPDATE = 1 << 2; // 0100
    	
    	// 是否允许删除,二进制第4位,0表示否,1表示是
    	public static final int ALLOW_DELETE = 1 << 3; // 1000
    	
    	// 存储目前的权限状态
    	private int flag;
    
    	/**
    	 *  重新设置权限
    	 */
    	public void setPermission(int permission) {
    		flag = permission;
    	}
    
    	/**
    	 *  添加一项或多项权限
    	 *  flag = 0001 | 0100,也就是0101,便拥有了Select和Update两项权限
    	 */
    	public void enable(int permission) {
    		flag |= permission;
    	}
    	
    	/**
    	 *  删除一项或多项权限
    	 *  0101&(~0001),0101&1110=0100
    	 */
    	public void disable(int permission) {
    		flag &= ~permission;
    	}
    	
    	/**
    	 *  是否拥某些权限
    	 *  0101&0001=0001,0001==ALLOW_SELECT,可知拥有查询权限
    	 */
    	public boolean isAllow(int permission) {
    		return (flag & permission) == permission;
    	}
    	
    	/**
    	 *  是否禁用了某些权限
    	 *  0101&0010=0000,可知拥有没有该权限
    	 */
    	public boolean isNotAllow(int permission) {
    		return (flag & permission) == 0;
    	}
    	
    	/**
    	 *  是否仅仅拥有某些权限
    	 */
    	public boolean isOnlyAllow(int permission) {
    		return flag == permission;
    	}
    }
    

    按位或¦

    常用来将源操作数某些位置变成1,其它位不变。 (mask中特定位置1,其它位为0 s=s ¦mask)

    位异或^

    使特定位的值取反(mask中特定位置1,其它位为0 s=s^mask)

    不引入第三变量,交换两个变量的值

    x ^= y; 
    y ^= x; 
    x ^= y; 
    

    位非( ~ )

    5转换为二进制:0000 0000 0000 0000 0000 0000 0000 0101


    -6转换为二进制:1111 1111 1111 1111 1111 1111 1111 1010

    位非:操作数的第n位为1,那么结果的第n位为0,反之

  • 相关阅读:
    ASP.NET MVC使用Bootstrap系列(3)——使用Bootstrap 组件
    ASP.NET MVC使用Bootstrap系统(2)——使用Bootstrap CSS和HTML元素
    ASP.NET MVC使用Bootstrap系列(1)——开始使用Bootstrap
    C# 调用颜色的RGB值_RGB颜色转换十六进制颜色
    在C#中,Json的序列化和反序列化的几种方式总结
    Newtonsoft.Json(Json.Net)学习笔记
    C#,WebRequest类、HttpWebRequest类与HttpRequest类的区别
    python遍历目录的方法 walk listdir
    Debug始于71年前
    如何实现前端微服务化
  • 原文地址:https://www.cnblogs.com/chensongxian/p/7055123.html
Copyright © 2011-2022 走看看