public class BitUtils { /** * * @param oldV 旧值 * @param newV 新值 * @return bit位上有变化的,当前bitw位值 */ public static Map<Integer, Character> getCurrentStatusChanged(long oldV, long newV){ Map<Integer, Character> map = new HashMap<Integer, Character>(); long l =oldV ^ newV; List<Integer> bit1_pos = getVal1Bit(l); for(int bit1 : bit1_pos){ map.put(bit1, getLongBitStatus((int)newV,bit1)); } return map; } public static List<Integer> getVal1Bit(Long l){ List<Integer> val1 = new ArrayList<Integer>(); if(l ==null) return val1; String bits =Long.toBinaryString(l); char[] chars =bits.toCharArray(); ArrayUtils.reverse(chars); for(int i=0; i<chars.length; i++){ if(chars[i]=='1'){ val1.add(i); } } return val1; } public static char getLongBitStatus(int num, int pos){ String bitP = Integer.toBinaryString(num); return (pos > (bitP.length()-1))?'0': bitP.charAt(bitP.length()-1-pos); } public static void main(String[] args) { System.out.println(getCurrentStatusChanged(9,12)); } }
输出结果:
{0=0, 2=1}