你是否曾经在真实项目中使用过位移操作?

83

你是否曾经在实际编程项目中使用过 位移操作?大多数(如果不是全部)高级语言都有这种操作符,但是什么情况下才需要使用它们呢?

42个回答

1
我不得不编写一个程序来解析DVD光盘上的.ifo文件。这些文件包含了有关光盘上有多少个标题、章节、菜单等的信息。它们由各种大小和对齐方式的压缩位组成。我怀疑许多二进制格式都需要类似的位移操作。

1

我曾经看到位运算符在多个标志被用作属性参数时使用。例如,数字4 = 1 0 0表示设置了三个标志中的一个。这对于公共API来说不是很好,但在特殊情况下可以加快速度,因为检查位是快速的。


1

我所写的每个位块传输程序都无法完成左右移位的能力。


1

我曾经在游戏中使用它们,将一堆标志打包成一个字节/字符,以便保存到数据卡中。例如存储可解锁内容的状态等。虽然现在不是必需品,但可以节省工作。


1

我在一个嵌入式系统的项目中使用它来读取显示器的EDID数据。 EDID中的某些数据是这样编码的:

第3字节:
水平消隐-低8位
第4字节:
低四位:水平消隐-高4位
高四位:其他内容

1

是的,当在Java和C#应用程序之间执行二进制通信时,一个是大端字节顺序,另一个是小端字节顺序(不一定按照此顺序)。我创建了一个InputStream类,可以读取具有不同字节顺序的数字,并使用字节移位来使其工作。

有时候,当您想要将4个short放入long的4个字节中时,就需要使用字节移位。我想我很多年前就这样做了...


0

我在扑克牌手牌评估器中使用了它们。

一副扑克牌手牌可以表示为一个64位无符号整数,其中每张牌都有一个1位。通过移位和掩码的组合,您可以询问诸如“给我所有我手中至少有3张牌的等级”等问题。

这种方法相当快,但我后来学到了更快的方法,其中手牌表示为字节数组。


0

是的。

在嵌入式应用程序中,位移操作非常有用,特别是当内存紧张且速度至关重要时。

例如,您可以使用加法和位移操作来执行相同的计算,而不必进行昂贵的乘法运算,这将节省大量时间:

c := 0
while b != 0
    if (b and 1) != 0
        c := c + a
    shift a left by one
    shift b right by one
return c

0

我将在计算机科学方面毕业,我已经使用了位移。

它们对于存储标志、使用哈希等非常有用,人们已经说过了。

我曾经使用位运算将一个小整数(2个字节)的值和2个字符压缩成一个整数。与同学的项目相比,这为我节省了很多内存。

有时,这些操作在算术运算中也非常快,例如当您必须扩展双倍类型或使用函数来操纵使用尾数的浮点数据时(请参见浮点算术标准)。


0

我在 CRC 计算中使用了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接