真实世界的按位运算符用例
以下按位运算符的实际使用情况是什么?
位字段(标志)
它们是表示状态由几个“是或否”属性定义的最有效方式。 ACL就是一个很好的例子。 如果您有4个离散权限(读取,写入,执行,更改策略),最好将其存储为1个字节而不是浪费4.这些可以映射到多种语言的枚举类型,以增加方便性。
通过端口/插座进行通信
总是涉及校验和,奇偶校验,停止位,流量控制算法等等,这些通常取决于单个字节的逻辑值而不是数值,因为介质一次只能传输一位数据。
压缩,加密
这两者都严重依赖于按位算法。 看一个例子的deflate算法 - 一切都在位,而不是字节。
有限状态机
我主要讲的是嵌入在硬件中的那种,尽管它们也可以在软件中找到。 它们本质上是组合的 - 它们可能实际上被“编译”成一堆逻辑门,所以它们必须被表达为AND
, OR
, NOT
等。
图形这里几乎没有足够的空间进入这些操作员在图形编程中使用的每个区域。 XOR
(或^
)在这里特别有趣,因为第二次应用相同的输入将撤消第一个。 较老的图形用户界面过去依赖于此选择突出显示和其他叠加层,以消除对昂贵重绘的需求。 它们仍然适用于慢速图形协议(即远程桌面)。
这些只是我提出的前几个例子 - 这不是一个详尽的列表。
奇怪吗?
(value & 0x1) > 0
它可以被两个(偶数)整除吗?
(value & 0x1) == 0
低级编程就是一个很好的例子。 例如,您可能需要将特定位写入内存映射寄存器,以使某个硬件按照您的需要进行操作:
volatile uint32_t *register = (volatile uint32_t *)0x87000000;
uint32_t value;
uint32_t set_bit = 0x00010000;
uint32_t clear_bit = 0x00001000;
value = *register; // get current value from the register
value = value & ~clear_bit; // clear a bit
value = value | set_bit; // set a bit
*register = value; // write it back to the register
而且, htonl()
和htons()
使用&
和|
来实现 运算符(在字节顺序(字节顺序)与网络顺序不匹配的机器上):
#define htons(a) ((((a) & 0xff00) >> 8) |
(((a) & 0x00ff) << 8))
#define htonl(a) ((((a) & 0xff000000) >> 24) |
(((a) & 0x00ff0000) >> 8) |
(((a) & 0x0000ff00) << 8) |
(((a) & 0x000000ff) << 24))
链接地址: http://www.djcxy.com/p/72667.html