首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >实现Externalizable,这样可以最大限度地节省空间

实现Externalizable,这样可以最大限度地节省空间
EN

Stack Overflow用户
提问于 2021-06-30 03:56:14
回答 1查看 49关注 0票数 0

我有class元素,它有以下属性(参见class)。由于这两个整数值的范围非常小,所以我想把它们存储在一个短的地方。这对我不起作用。我想使用位移位。我在这里做错了什么?这是学校的作业,所以一定是短篇。

代码语言:javascript
复制
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(){}
}
EN

回答 1

Stack Overflow用户

发布于 2021-06-30 15:50:12

以相反的顺序读取数据。使用二元and运算符而不是模运算符,因为short是有符号的。然后负数会导致您的评论中描述的问题。

readExternal更改为:

代码语言:javascript
复制
@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;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68184899

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档