资讯专栏INFORMATION COLUMN

二进制状态码

derek_334892 / 1794人阅读

摘要:二进制状态码存储的主要好处是节省存储空间,相对于键值对对象存储而言可读性较差当然文件权限这种另说。所以注意如果后端返回二进制状态码让前端判断,确保后端使用存储完

我们知道计算机中数据都是用二进制数存储。二进制数是一系列0和1的组合,长整型64位,最短的字节型也有8位。其中每一位0和1都可以看做一种状态的开和关,所以就有了这样的一种状态码存储方式:把同一对象的多种状态按位组合到一个整数中。

例如我们最最常见的 *nix 文件权限:

第9位 第8位 第7位 第6位 第5位 第4位 第3位 第2位 第1位 第0位
是否目录 所有者读权限 所有者写权限 所有者执行权限 组读权限 组写权限 组执行权限 其余用户读权限 其余用户写权限 其余用户执行权限
0 1 1 1 1 0 1 1 0 1

那么这一组状态在程序中表示为:0b0111101101,即八进制的 0o755,十进制的 493

二进制状态码存储的主要好处是节省存储空间,相对于键值对(对象)存储而言可读性较差(当然文件权限这种另说)。这种存储方式仅适用于“一个对象有多种状态,每种状态仅有两种情况”这一情形,请不要对一种状态多种情况的情形使用二进制状态码存储方式,更不要出现十进制的 0 1 10 这种状态码,很蠢。。。

使用位运算操作状态码

基于这种存储方式,也衍生了一些操作状态码的方式:

判断第 x 位状态是否开启(x 以 0 开始,下同):
status & (1 << x) == 0 // bt ( bit test )
打开第 x 位
status |= 1 << x // bts ( bit test and set )
重置第 x 位
status &= ~(1 << x) // btr ( bit test and reset )
取反第 x 位
status ^= 1 << x // btc ( bit test and complement )
编程语言支持

某些编程语言提供了对二进制状态码的一些原生支持。C/C++ 提供了 位域,以及专门的模板库 bitset 用于简化位运算操作。C# 则提供了 Flags 特性标记某个枚举被视作位域

另外很重要一点,JavaScript 虽然也支持位运算,但由于 JavaScript 中的 number 类型都是双精度浮点数,在做位运算时会先将数值截断至 32 位长度。例如很著名的数字转整数bug:10000000000 | 0 => 1410065408。所以注意如果后端返回二进制状态码让前端判断,确保后端使用 uint32_t 存储

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/101500.html

相关文章

  • 【译】 WebSocket 协议第七章——关闭连接(Closing the Connection)

    摘要:状态码当关闭一个连接时如在开始握手已经完成后,发送一个关闭帧,终端可能会说明关闭的原因。表示终端由于协议错误中止了连接。这个状态码是为了给上层应用表示连接被异常关闭如没有发送或者接受一个关闭帧这种场景的使用而设计的。 概述 本文为 WebSocket 协议的第七章,本文翻译的主要内容为 WebSocket 连接关闭相关内容。 关闭连接(协议正文) 7.1 定义 7.1.1 关闭 Web...

    Freeman 评论0 收藏0
  • 正则表达式的元字符和转义字符,又及转义字符和ASCII之间的关系小解

    摘要:现在解释和正则匹配中的转义字符之间的关系其实中的转义字符和正则中的转义字符是同一样东西,都是特殊意义的字符,也算对中一些特殊字符或不能显示的字符的定义或别称。 1、正则表达式的组合 正则表达式由元字符和转义字符组成 元字符有 ^ :断言目标的开始位置(或多行模式下的行首位置) $ :断言目标的介绍位置(或多行模式下的结尾位置) . :匹配除换行符外的其他任何字符 [ :匹配字...

    Jensen 评论0 收藏0
  • HTTP 状态

    摘要:状态码有哪些一般大家都知道页面不存在,服务器错误,重定向,临时重定向,,未授权啥的。总结仅仅三个状态码,都可以牵涉到如此丰富的知识,对于状态码,我们不能只是片面的去背诵状态码及对应的含义,要去主动挖掘,深入,借助状态码来建立自己的网络体系。 之前写的一些笔记,简单记录在这里。 http状态码有哪些? 一般大家都知道404页面不存在,500服务器错误,301重定向,302临时重定向,2...

    yuanzhanghu 评论0 收藏0
  • 面试必考之http状态有哪些

    摘要:背景状态码有哪些,这也是一个很高频的面试问题。总结仅仅三个状态码,都可以牵涉到如此丰富的知识,对于状态码,我们不能只是片面的去背诵状态码及对应的含义,要去主动挖掘,深入,借助状态码来建立自己的网络体系。 背景 http状态码有哪些,这也是一个很高频的面试问题。一般大家都知道404页面不存在,500服务器错误,301重定向,302临时重定向,200ok,401未授权啥的。 如果只是简单的...

    wing324 评论0 收藏0
  • 【译】WebSocket协议第五章——数据帧(Data Framing)

    摘要:数据帧协议正文概览在协议中,数据是通过一系列数据帧来进行传输的。注意无论协议是否使用了,帧都需要添加掩码。服务端收到没有添加掩码的数据帧以后,必须立即关闭连接。服务端禁止在发送数据帧给客户端时添加掩码。 概述 本文为WebSocket协议的第五章,本文翻译的主要内容为WebSocket传输的数据相关内容。 数据帧(协议正文) 5.1 概览 在WebSocket协议中,数据是通过一系列数...

    Yujiaao 评论0 收藏0

发表评论

0条评论

最新活动
阅读需要支付1元查看
<