2012-12-29 158 views
2

如果我在一个比特集Java bitSet开始从右向左或从左向右设置位?

BitSet x= new BitSet(8); 
    x.set(0);//.........Case1 

    x.set(7);//.........Case2 

设置两个不同的比特在这种情况下,我米设置最显著位?

+2

一个bitset不是一个数字,它是一个具有同等重要性的位列表。 –

+1

BitSet上的操作是通过索引执行的。 –

+0

@MarkRotteveel Got Ya –

回答

2

有点集不是一个巨大的数字。这是一组(技术上来说,是一个向量/列表/无限数组)。 BitSet甚至没有将其转换为数字的方法。

关于内部表示 - 这是依赖于实现的。虽然一个实现可以选择将位0作为其内部数组中第一个整数的最低有效位进行存储,但这并不是一成不变的。我想认为 Sun的实现这样做(除了它使用一个long数组,而不是int)。

但是,bitSets和整数之间有一个自然双射。位集合从0开始被整数化,并且任何非负整数都可以以自然的方式被唯一地表示为一个二进制数,最低有效位被存储为位0. 在这种双向注入下,位7是比位0更重要,但是对于位集中的每一位,每一位的下一位更为重要。

0

虽然最重要的位对于BitSet来说纯粹是主观的,但是设置两端可以说其中一个可能是最重要的,但是可以说它是哪一个。 ;)

如果你想设置一个字节的最高(和最低)显著位,你可以做

byte b = (byte) ((1 << 7) | (1 << 0)); 

byte b = 0; 
b |= 1 << 0; 
b |= 1 << 7; 
1

的LSB是索引0

实施例: 让我们创建的字符'a'(二进制0110 0001)。

请注意:添加到0

BitSet bitSet = new BitSet(8); 

bitSet.set(7, false); 
bitSet.set(6, true); 
bitSet.set(5, true); 
bitSet.set(4, false); 

bitSet.set(3, false); 
bitSet.set(2, false); 
bitSet.set(1, false); 
bitSet.set(0, true); 

// let's convert it to a byte[] 
byte[] array = bitSet.toByteArray(); 

// and let's convert that byte[] to text now. 
String someText = new String(array, Charsets.US_ASCII); 

// this will print an 'a' 
System.out.println(someText); 

位左到右,转换从指数7下运行的是一样的(JDK7 +):

System.out.println((char)0b01100001);