Created
June 23, 2016 09:23
-
-
Save SiZapPaaiGwat/08b2947633298704274cfda405a9ebb2 to your computer and use it in GitHub Desktop.
https://repl.it/C5OT/2 created by simongfxu
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
/** | |
* 在线体验地址 | |
* https://repl.it/C5OT/1 | |
*/ | |
import java.util.*; | |
import java.lang.*; | |
public class Main { | |
public static void main(String args[]) { | |
int len = 16; | |
BitSet bits1 = new BitSet(len); | |
BitSet bits2 = new BitSet(len); | |
for (int i = 0; i < len; i += 1) { | |
if ((i%2) == 0) { | |
bits1.set(i); | |
} | |
if ((i%5) != 0) { | |
bits2.set(i); | |
} | |
} | |
System.out.println("BitSet.size()表示实际使用的存储空间"); | |
System.out.println(bits1.size()); | |
System.out.println(bits2.size()); | |
System.out.println("BitSet.length()表示逻辑大小,最高设置位的索引加1,不一定是16"); | |
System.out.println(bits1.length()); | |
System.out.println(bits2.length()); | |
System.out.println("BitSet.toString返回字符串表示形式,依次表示为真的索引"); | |
System.out.println(bits1.toString()); | |
System.out.println(bits2.toString()); | |
System.out.println("BitSet.and执行逻辑与操作,会改变当前BitSet"); | |
BitSet bits3 = immutableAnd(bits2, bits1); | |
System.out.println(bits1); | |
System.out.println(bits2); | |
System.out.println(bits3); | |
System.out.println("BitSet转换为二进制表示"); | |
System.out.println(toString(bits1, 16)); | |
System.out.println(toString(bits2, 16)); | |
System.out.println(toString(convertIPAsBitSet("192.168.0.1"), 32)); | |
} | |
public static String toString(BitSet bs, int len) { | |
StringBuilder sb = new StringBuilder(bs.length()); | |
for (int i = 0; i < len; i += 1) { | |
sb.append(bs.get(i) ? "1" : "0"); | |
} | |
return sb.toString(); | |
} | |
public static BitSet immutableAnd(BitSet bs1, BitSet bs2) { | |
BitSet cloned = (BitSet)bs1.clone(); | |
cloned.and(bs2); | |
return cloned; | |
} | |
/** | |
* 将IP地址使用BitSet存储 | |
*/ | |
public static BitSet convertIPAsBitSet(String ip) { | |
String[] items = ip.split("\\."); | |
byte fragLen = (byte)items.length; | |
byte len = (byte)(fragLen * 8); | |
BitSet bs = new BitSet(len); | |
for (byte i = 0; i < fragLen; i += 1) { | |
int num = Integer.parseInt(items[i]); | |
if (num > 255) { | |
throw new RuntimeException("IP格式错误"); | |
} | |
// toBinaryString按自然位置返回的顺序,需要调整 | |
String binaryFormat = new StringBuilder(Integer.toBinaryString(num)).reverse().toString(); | |
for (byte j = 0; j < binaryFormat.length(); j += 1) { | |
if (binaryFormat.charAt(j) == '1') { | |
bs.set((fragLen - i - 1) * 8 + j); | |
} | |
} | |
} | |
return bs; | |
} | |
} |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
java version "1.8.0_31" | |
Java(TM) SE Runtime Environment (build 1.8.0_31-b13) | |
Java HotSpot(TM) 64-Bit Server VM (build 25.31-b07, mixed mode) | |
>>> BitSet.size()表示实际使用的存储空间 | |
64 | |
64 | |
BitSet.length()表示逻辑大小,最高设置位的索引加1,不一定是16 | |
15 | |
15 | |
BitSet.toString返回字符串表示形式,依次表示为真的索引 | |
{0, 2, 4, 6, 8, 10, 12, 14} | |
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14} | |
BitSet.and执行逻辑与操作,会改变当前BitSet | |
{0, 2, 4, 6, 8, 10, 12, 14} | |
{1, 2, 3, 4, 6, 7, 8, 9, 11, 12, 13, 14} | |
{2, 4, 6, 8, 12, 14} | |
BitSet转换为二进制表示 | |
1010101010101010 | |
0111101111011110 | |
10000000000000000001010100000011 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment