栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

某些运算符“ |”,“ ^”,“&”,“&^”之间的差异。高朗

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

某些运算符“ |”,“ ^”,“&”,“&^”之间的差异。高朗

当您必须处理 字节或位级数据 时,按位运算符会起作用。

在这里,我列出了一些使用位操作和代码示例的示例(无特定顺序):


1. 它们是 密码术哈希函数
(例如MD5)中许多算法的通用和组成部分。

2. 如果您想“节省”空间并且 将多个“布尔”变量打包 到一个
变量中

int
,例如,您为每个布尔变量分配一个位,则通常也使用它们。您必须使用按位运算符才能单独更改/读取位。

例如,将8位/布尔打包成一个

int

flags := 0x00  // All flags are 0flags |= 0x02  // Turn the 2nd bit to 1 (leaving rest unchanged)flags |= 0xff  // Turn 8 bits (0..7) to 1flags &= 0xfe  // Set the lowest bit to 0 (leaving rest unchanged)istrue := flags&0x04 != 0 // Test if 3rd bit is 1

3. 另一个领域是 压缩数据 ,您希望充分利用这些
数据

byte
并使用其所有位来存储/获取一些信息(位是计算和数字通信中信息的基本单位)。

4. 与压缩相似,但不完全相同: bitstreams 。它也通过不发送完整的字节而是发送具有任意位长的字段来节省数据流中的空间。

我已经编写并发布了高度优化的位级Reader和Writer程序包,在此处开源:
**github.com/icza/bitio**
。您将在其源代码中看到各种位操作的广泛使用。

5. 另一实际用法: 测试(整数)数字的某些属性
。知道整数的二进制表示形式(二进制补码),二进制的数字形式具有某些特征。例如,如果最低位是0,则整数(以2的补码表示)是
偶数 (可以除以2):

func isEven(i int) bool {    return i&0x01 == 0}

通过测试整数的位,您还可以知道它是否是2的幂。例如,如果一个正数仅包含一位

1
,则它是2的幂(例如
2 = 0x02 = 00000010b
16 =0x10 = 00010000
17 = 0x11 = 00010001
不是2的幂)。

6. 许多编码/解码过程
也使用位操作。最简单的是UTF-8编码,它使用可变长度编码将unipre码点(

rune
Go中)表示为字节序列。
变长编码的一个简单变体是使用一个字节的最高位(如果索引为0,则使用8或7)来表示是否需要更多字节来解码一个数字,其余7位始终是“有用的”。
”数据。您可以测试最高位并“分离” 7个有用的位,如下所示:

b := readoneByte()usefulBits := b & 0x7fhasMoreBytes := b & 0x80 != 0

使用这种可变长度编码的好处是,即使您

uint64
在Go中使用的类型(在内存中为8个字节),仍可以使用较少的字节来表示较小的数字(范围内的数字
0..127
仅需要1个字节!)。如果要存储或传输的样本具有许多较小的值,则仅此一项就可以将数据压缩为1/8
= 12.5%。不利的一面是,大数字(即使在最高字节中也有位)将使用8个以上的字节。是否值得取决于样本的试探法。

X. 清单继续…


您可以在不知道/不使用Go(以及许多其他编程语言)的按位运算符的情况下生活吗?答案是肯定的。但是,如果您了解它们,有时它们可​​以使您的生活更轻松,程序更高效。

如果您想了解更多有关该主题的信息,请阅读Wikipedia文章:按位运算,然后使用Google术语“按位运算符教程”,那里有很多不错的文章。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/447914.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号