【问题标题】:Practical applications of bit shifting移位的实际应用
【发布时间】:2012-02-26 18:41:54
【问题描述】:

我完全理解 如何 移位。我已经在纸上和代码中完成了许多示例,并且不需要任何帮助。

我正在尝试提出一些如何使用位移的真实示例。以下是我能想到的一些例子:

  • 也许我能概念化的最重要的例子与字节序有关。在大端系统中,最低有效位从左侧存储,而在小端系统中,最低有效位从右侧存储。我想对于使用相反字节序策略的系统之间的文件和网络传输,必须进行某些转换。

  • 在处理 n^2、n^4 等任何乘法时,编译器和处理器似乎可以进行某些优化。这些位只是向左移动。 (相反,我想这同样适用于除法,n/2、n/4 等)

  • 在加密算法中。即使用一系列位移、反转和组合来混淆某些东西。

这些都是准确的例子吗?你有什么要补充的吗?我花了很多时间学习如何实现位移/重新排序/字节交换,我想知道如何实际应用它=)

【问题讨论】:

标签: c bit-shift bits


【解决方案1】:

我不同意最重要的例子是字节序,但它很有用。你的例子是有效的。

散列函数经常使用位移作为获得混乱行为的一种方式;与您的加密算法没有什么不同。

【讨论】:

  • 那么比如说随机数组排序?
  • @CalvinFroedge 如果您所说的“随机数组”是指由随机数填充的数组,那么香草快速排序仍然不败。
【解决方案2】:

一个常见的用途是使用 int/long 作为一系列标志值,可以通过位运算符检查、设置和清除。

并没有真正广泛使用,但在(某些)国际象棋游戏中,棋盘和棋步用 64 位整数值(称为位棋盘)表示,因此评估合法棋步、下棋步等是通过位运算符完成的。网上有很多关于这个的解释,但这个似乎是一个很好的解释:http://www.frayn.net/beowulf/theory.html#bitboards

最后,在一些技术面试中,您可能会发现需要计算 int/long 中设置的位数!

【讨论】:

    【解决方案3】:

    我知道的最常见的按位移位用法示例是设置和清除位。

    uint8_t bla = INIT_VALUE;
    
    bla |= (1U << N);   // Set N-th bit
    bla &= ~(1U << N);  // Clear N-th bit
    

    【讨论】:

    • 为什么需要这样做?
    • @CalvinFroedge 在嵌入式世界中,例如,广泛用于读取或写入 IO 寄存器的特定位。
    【解决方案4】:
    1. 2 的幂的快速乘除 - 在嵌入式应用中尤其重要
    2. CRC computation - 适用于网络,例如以太网
    3. 需要大量数字的数学计算

    我脑子里只有一对

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-12-11
      • 2011-05-16
      相关资源
      最近更新 更多