關於二進位制的一些用法
阿新 • • 發佈:2018-11-06
二進位制的基本使用
int a = 4, b = 6; System.out.println("4的二進位制是 " + Integer.toBinaryString(a));//100 System.out.println("6的二進位制是 " + Integer.toBinaryString(b));//110 // & 規則:1&1=1, 1&0=0, 0&0=0 System.out.println("4&6 " + Integer.toBinaryString(4 & 6));//100 // | 規則:1|1=1, 1|0=1, 0|0=0 System.out.println("4|6 " + Integer.toBinaryString(4 | 6));//110 // ~ 規則:~1=0, ~0=1 System.out.println("~4 " + Integer.toBinaryString(~4));//11111111111111111111111111111011 // ^ 規則:1^1=0, 0^0=0, 1^0=1 System.out.println("4^6 " + Integer.toBinaryString(4 ^ 6)); //10 // 任何整數a與b(b=2的n次方)取餘=a&(b-1) System.out.println("345%16 " + (345 % 16) + " or " + (345 & (16 - 1))); //9 or 9
二進位制的實用場景
- jdk許可權管理
- 判斷商品是否有某種屬性
他們的原理都是一樣的。一個位上要麼是1,要麼是0,1表示擁有,0表示不擁有。這樣對於原本需要用多個變數來表示的屬性擁有關係可以直接用一個int值來表示。(java中int是32位,如果要表示的屬性多於31可以使用long。)
二進位制許可權demo
public class Permission { private static final int ALLOW_INSERT = 1 << 0; //1 private static final int ALLOW_DELETE = 1 << 1; //2 private static final int ALLOW_UPDATE = 1 << 2; //4 private static final int ALLOW_SELECT = 1 << 3; //8 // 表示擁有的許可權 private int flag = 0; public int getFlag() { return flag; } // 新增許可權 public void enable(int permission) { flag = flag | permission; } public void enable(int... permission) { for (int p : permission) { flag = flag | p; } } // 禁用許可權 public void disenable(int permission) { flag = flag & (~permission); } // 檢視是否有某一許可權 public boolean has(int permission) { return permission == (permission & flag); } // 檢視是否沒有某一許可權 public boolean noHas(int permission) { return 0 == (permission & flag); } public static void main(String[] args) { Permission p = new Permission(); p.enable(ALLOW_INSERT); System.out.println("有了 新增 " + p.getFlag()); p.enable(ALLOW_DELETE, ALLOW_UPDATE, ALLOW_SELECT); System.out.println("有了 刪改查 " + p.getFlag()); p.disenable(ALLOW_INSERT); System.out.println("沒了 新增 " + p.getFlag()); System.out.println("是否有 刪除 " + p.has(ALLOW_DELETE)); System.out.println("是否有 新增 " + p.has(ALLOW_INSERT)); System.out.println("是否沒有 檢視 " + p.noHas(ALLOW_SELECT)); } }