二进制在项目中的使用场景

2020-07-14  本文已影响0人  fyg
/**
 * 将一个 int 分为两段,前 16 位存储一级菜单,分别是 美颜、美型、滤镜选项
 * 第 17~24 位存储二级菜单,如美颜的 大眼、瘦脸等,美型选项的 瘦脸、大眼等
 * 最后 8 位存储三级菜单,目前只有美妆选项使用到,如存储美瞳的几种种类,这个还没有集成呢
 */
public interface ItemGetContract {
    int OFFSET = 16;
    int MASK = ~0xFFFF;
    int SUB_OFFSET = 8;

    // 一级菜单

    int TYPE_CLOSE = -1;
    // 美颜
    int TYPE_BEAUTY_FACE = 1 << OFFSET;
    // 美型
    int TYPE_BEAUTY_RESHAPE = 2 << OFFSET;
    // 滤镜
    int TYPE_FILTER = 5 << OFFSET;

    // 二级菜单

    // 美颜
    int TYPE_BEAUTY_FACE_SMOOTH = TYPE_BEAUTY_FACE + (1 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_WHITEN = TYPE_BEAUTY_FACE + (2 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_SHARPEN = TYPE_BEAUTY_FACE + (3 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_BRIGHTEN_EYE    = TYPE_BEAUTY_FACE     + (4 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_REMOVE_POUCH    = TYPE_BEAUTY_FACE     + (5 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_SMILE_FOLDS    = TYPE_BEAUTY_FACE   + (6 << SUB_OFFSET);
    int TYPE_BEAUTY_FACE_WHITEN_TEETH    = TYPE_BEAUTY_FACE     + (7 << SUB_OFFSET);

    // 美型
    int TYPE_BEAUTY_RESHAPE_FACE_OVERALL = TYPE_BEAUTY_RESHAPE + (1 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_EYE = TYPE_BEAUTY_RESHAPE + (2 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_FACE_SMALL = TYPE_BEAUTY_RESHAPE + (3 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_FACE_CUT = TYPE_BEAUTY_RESHAPE + (4 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_CHEEK = TYPE_BEAUTY_RESHAPE + (5 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_JAW = TYPE_BEAUTY_RESHAPE + (6 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_NOSE_LEAN = TYPE_BEAUTY_RESHAPE + (7 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_NOSE_LONG = TYPE_BEAUTY_RESHAPE + (8 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_CHIN = TYPE_BEAUTY_RESHAPE + (9 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_FOREHEAD = TYPE_BEAUTY_RESHAPE + (10 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_EYE_ROTATE = TYPE_BEAUTY_RESHAPE + (11 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_MOUTH_ZOOM = TYPE_BEAUTY_RESHAPE + (12 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_MOUTH_SMILE = TYPE_BEAUTY_RESHAPE + (13 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_DECREE = TYPE_BEAUTY_RESHAPE + (14 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_DARK = TYPE_BEAUTY_RESHAPE + (15 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_EYE_SPACING = TYPE_BEAUTY_RESHAPE + (16 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_EYE_MOVE = TYPE_BEAUTY_RESHAPE + (17 << SUB_OFFSET);
    int TYPE_BEAUTY_RESHAPE_MOUTH_MOVE = TYPE_BEAUTY_RESHAPE + (18 << SUB_OFFSET);

    interface View extends IView {
    }

    abstract class Presenter extends BasePresenter<View> {
        /**
         * 根据类型返回一个 {@link ButtonItem} 列表
         */
        public abstract List<ButtonItem> getItems(int type);
    }
}

如上代码转换成 二进制后:


一个int 占4个字节32位,转为二进制为:

美颜 定义为1, 左移16位
美型 定义为2,左移16位
滤镜 定义为5,左移16位

二进制1.png 二进制2.png
二进制之前的& | ~ ^ 运算请查看我的

StateMachine项目
封装了位运算符,使用更加方便

关注我的github

https://github.com/fuyuguang
带你了解更多项目实践中的bug

上一篇下一篇

猜你喜欢

热点阅读