问题描述
我有类 Element,它具有以下属性(请参阅类)。由于这两个整数值的范围非常小,我想将它们存储在一个短的。这对我不起作用。我想使用位移位。我在这里做错了什么?这是学校作业,所以一定要简短。
public class Element implements Externalizable {
private static final long serialVersionUID = 6529685098267757690L;
private boolean isMarked;
private boolean isValid;
private boolean isDeleted;
private int key; // VALUE AREA: 0-500
private int value; // VALUE AREA: 1-10
@Override
public void writeExternal(ObjectOutput out) throws IOException {
short val =0;
if(this.isMarked) val|=1;
val <<=1;
if(this.isValid) val|=1;
val <<=1;
if(this.isDeleted) val|=1;
val <<=4;
val |= this.value;
val <<=9;
val |= (short) this.key;
out.writeShort(val);
}
@Override
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
short s = in.readShort();
this.isMarked = s % 2==1;
s >>= 1;
this.isValid =s % 2==1;
s >>>= 1;
this.isDeleted = s % 2==1;
s >>>= 4;
this.value = s % 8;
s >>>=9;
this.value = s % 512;
}
@Override
public String toString() {
return "Element{" +
"isMarked=" + isMarked +
",isValid=" + isValid +
",isDeleted=" + isDeleted +
",key=" + key +
",value=" + value +
'}';
}
public Element(boolean isMarked,boolean isValid,boolean isDeleted,int key,int value) {
this.isMarked = isMarked;
this.isValid = isValid;
this.isDeleted = isDeleted;
this.key = key;
this.value = value;
}
public Element(){}
}
解决方法
以相反的顺序读取数据。使用二元和运算符而不是模运算符,因为 short 是有符号的。负数会导致您在评论中描述的问题。
将 readExternal
更改为:
@Override
public void readExternal(ObjectInput in) throws IOException,ClassNotFoundException {
short s = in.readShort();
this.key = s & 511; // masks the lower 9 bits
s >>>= 9;
this.value = s & 15; // masks the lower 4 bits
s >>>= 4;
this.isDeleted = (s & 1) == 1;
s >>>= 1;
this.isValid = (s & 1) == 1;
s >>>= 1;
this.isMarked = (s & 1) == 1;
}