您是否曾经在实际的编程项目中使用过位移?大多数(如果不是全部)高级语言中都包含移位运算符,但是您何时真正需要使用它们?
您是否曾经在实际的编程项目中使用过位移?大多数(如果不是全部)高级语言中都包含移位运算符,但是您何时真正需要使用它们?
Answers:
我仍然为那些在硬件中不支持浮点的系统编写代码。在这些系统中,几乎所有算术都需要移位。
另外,您还需要移动以生成哈希。多项式算术(CRC,里德-所罗门代码是主流应用)或也使用移位。
但是,仅使用移位是因为它们很方便,并且可以准确表达作者的意图。您可以根据需要用乘法模拟所有位移,但这将更难编写,可读性较低,有时甚至更慢。
编译器检测可将乘法减少为移位的情况。
而且我无法想到很多情况下都在使用它们。通常情况是相反的-存在一些特定问题,事实证明,采用位运算将产生最佳结果(通常就性能而言-时间和/或空间)。
short
中的一个int
eger字段中存储例如两个s,而没有读取和锁定Session来读取两个单独值的开销。另外,节省了在会话中存储两个值的内存开销。
我一直使用它们的一个地方是为跨平台应用程序转换整数的字节序。在绘制2D图形时,它们有时也很方便(与其他位操作运算符一起使用)。
位移很快。它们在除法和模运算之前很久就已在CPU指令集中实现。我们中的许多人都将移位用于算术,这在铅笔和纸上很简单,但在我们的CPU上不可用。
例如:
是的,仍然需要它。
例如,在我的工作中,我们开发用于通过串行端口COMx与PLC通信的软件。必须处理一个字节内的位,我们每天都使用左移/右移和逻辑运算符OR,XOR,AND。
例如,假设我们需要打开一个字节的第3位(从右到左):
这样做效率更高:
Byte B;
B := B XOR 4;
代替:
Byte B = 0;
String s; // 0 based index
s = ConvertToBinary (B);
s[5] = "1";
B := ConvertToDecimal (s);
问候。
我在图像压缩/解压缩中经常使用它们,其中位图中的位被压缩。使用http://en.wikipedia.org/wiki/Huffman_coding,要压缩的内容由各种位数组成(它们并非全都是字节对齐的),因此,在对它们进行编码或解码时需要对它们进行位移位。
位移并不能解决高级编程问题,但是有时候我们不得不解决低级问题,而不必编写单独的C语言库来完成操作就很方便。那是我最猜想的用途。
我亲自使用它来编写EBCDIC字符集转换器的编码器。
移位在解密网络游戏的协议中被大量使用。这些协议旨在使用尽可能小的带宽,因此,与其在int32中传输服务器上的播放器数量,名称等,不如将所有信息打包成尽可能少的字节。如今,对于大多数人来说,使用宽带并不是真正必要的,但是当他们最初被设计时,人们使用56k调制解调器进行游戏,因此每一点都算在内。
最明显的例子是在Valve的多人游戏中,特别是Counter-Strike,Counter-Strike Source。Quake3协议也相同,但是Unreal并不是那么苗条。
这是一个示例(.NET 1.1)
string data = Encoding.Default.GetString(receive);
if ( data != "" )
{
// If first byte is 254 then we have multiple packets
if ( (byte) data[0] == 254 )
{
// High order contains count, low order index
packetCount = ((byte) data[8]) & 15; // indexed from 0
packetIndex = ((byte) data[8]) >> 4;
packetCount -= 1;
packets[packetIndex] = data.Remove(0,9);
}
else
{
packets[0] = data;
}
}
当然,您是否将其视为一个真实的项目还是只是一个业余爱好(在C#中)取决于您自己。
我曾经写过的每一个bitblt-er都无法完成没有左右滑动位的功能。
我在嵌入式系统项目中使用它,该系统必须读取监视器的EDID数据。EDID中的一些数据是这样编码的:
字节#3:
水平消隐-低8位
字节#4:
下半字节:水平消隐-高4位
上半字节:其他
是的,低级嵌入式软件一直都在使用位移。它也可以用作执行极其快速的数学运算的魔术,看看
http://betterexplained.com/articles/understanding-quakes-fast-inverse-square-root/
我曾经(很多年前)曾经为一个使用Excel Oper结构创建Excel Spreadsheets的项目编写了输出例程。这是一个二进制文件共振峰,需要大量的比特摆动。下面的链接给出了Oper结构Safari Books的风格。