除了快速数学之外,还有什么充分的理由使用位移位吗?

2023-11-27

我了解按位运算以及它们如何用于不同的目的,例如权限。但是,我似乎不明白位移运算符有什么用。我理解它们是如何工作的,但我想不出任何可能想要使用它们的场景,除非我想做一些非常快速的乘法或除法。使用位移位还有其他原因吗?


原因有很多,以下是一些:

  1. 假设您将黑白图像表示为位序列,并且您通常希望在此图像中设置单个像素。例如,您的字节偏移量可能是 x>>3,位偏移量可能是 x & 0x7,您可以通过以下方式设置该位: byte = byte | (1
  2. 实现处理可变长度位序列的数据压缩算法,例如霍夫曼编码。
  3. 您正在与某些硬件交互,例如串行通信设备,需要读取或设置一些控制位。

由于这些和其他原因,大多数处理器都具有位移和/或旋转指令以及其他逻辑指令(和/或/异或/非)。

从历史上看,乘法和除法的速度要慢得多,因为它们是更复杂的运算,而有些 CPU 根本没有这些运算。

另请参阅此处:您是否曾在实际项目中使用过位移位?

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

除了快速数学之外,还有什么充分的理由使用位移位吗? 的相关文章

  • 按位相等

    我需要在两个字节之间执行按位相等 这意味着 例如 如果我有两个字节 00011011 和 00011110 结果是 11111010 我看到的唯一快速方法是使用以下语句 byte a b set input bytes byte c a b
  • 如何使用按位运算符交错 2 个布尔值?

    假设我有两个 4 位值 ABCD and abcd 如何交错它 所以它变成AaBbCcDd 使用按位运算符 伪 C 语言示例 nibble a 0b1001 nibble b 0b1100 char c foo a b print bits
  • 向零舍入到最接近的 0x50 的简短按位方法?

    我正在尝试修补一个旧的 8 位汇编程序例程 它恰好是 M6800 但这并不是真正特定于机器的 以获取 16 位值并向下舍入到最接近的 0x50 dec 80 倍数 当前代码截断为最接近的32只需做一件事AND 0xE0到低字节 这当然会将低
  • 什么时候右移操作>>移位符号位什么时候不呢?

    我的问题是为什么a gt gt 1移位符号位 但不移位 a 0xaaaaaaaa gt gt 1 代码片段 int a 0xaaaaaaaa std cout lt lt sizeof a lt lt std endl getBits a
  • 如何理解Python中的i和-i? python 中的位操作

    我发现Python中的 表示基于位表达式的 与 运算 最近 我发现了一个非常聪明的代码 其中一行类似于 i i 其中 i 是一个整数 如何理解 i i 的结果 另外 python如何处理负整数 i 进行位操作 i i 清除所有位 1 但最后
  • 使用乘法执行整数除法[重复]

    这个问题在这里已经有答案了 查看编译器生成的 x86 程序集 我注意到 无符号 整数除法有时会实现为整数乘法 这些优化似乎遵循以下形式 value n gt value 0xFFFFFFFF n 1 0x100000000 例如 除以 9
  • 什么是低位和高位?

    谁能告诉我什么是低位和高位 如何识别高位和低位 下面是二进制形式 如何0110里面有更高位吗 0110 0111 1100 1010 1100 0111 1001 1011 就像十进制一样 二进制中较高位通常写在左侧 所以如果你看到0111
  • 在 C++ 中求和 1<<2 和 1<<3 时出现奇怪的输出

    所以我只是尝试用 C 进行一些位操作 这是我尝试过的 int a 1 lt lt 2 cout lt
  • 在一个整数中找到另一个整数的 MSB 位置左侧的 N 个连续零位

    问题是 给定一个整数val1然后 给定第二个整数 找到最高位组 最高有效位 的位置val2找到第一个整数生成的位置左侧的未设置位的连续区域 width指定minimum必须在连续中找到的未设置位的数量 即width里面没有 0 这是我的解决
  • 如何使用按位运算根据另外两个字节来分配一个字节的特定位? (根据蒙版进行位混合)

    我有3个字节 一个字节决定了第 3 个字节的哪些位需要更改 1 表示位需要更改 0 表示不应发生更改 第 2 个字节决定变化的位分配为 1 还是 0 第三个字节是发生变化的地方 有没有办法使用按位运算符来实现此目的 如果是这样 怎么办 一个
  • ConstantTimeByteEq 如何工作?

    在大神的密码库里 找到了这个函数ConstantTimeByteEq http golang org src pkg crypto subtle constant time go s 897 936 L17 它有什么作用 如何工作 Cons
  • 了解带有位移位的右移运算符

    我很难理解右移运算符 我理解左移 假设我们没有 int n 11 which is 1011 现在如果我们左移它n lt lt 1结果是 int a n lt lt 1 so a 10110 simply add a 0 to the en
  • 将位图旋转 90 度

    我有一个1 个 64 位整数 我需要在 8 x 8 区域中旋转 90 度 最好使用直接位操作 我想不出任何方便的算法 例如 这个 0xD000000000000000 110100000000000000000000000000000000
  • 编译器如何实现位域运算?

    当询问如何做的问题时包裹 N 位有符号减法 https stackoverflow com questions 8309538 integer subtraction with wrap around for n bits我得到了以下答案
  • 如何在 C 中创建最低有效位设置为 1 的掩码

    这个功能如何运作 最低有效 n 位设置为 1 的掩码 Example n 6 gt 0x2F n 17 gt 0x1FFFF 我根本不明白这些 尤其是 n 6 gt 0x2F 另外 什么是面膜 通常的方法是采取1 并将其左移n位 这会给你类
  • 如何去交织位(UnMortonizing?)

    从 32 位 int 中解交织位的最有效方法是什么 对于这种特殊情况 我只关心奇数位 尽管我确信将任何解决方案推广到这两个集合都很简单 例如我想转换0b01000101 into 0b1011 最快的方法是什么 EDIT 在这个应用程序中
  • 在设置/重置位方面,“分支”意味着什么?

    在一次采访中 我被问到 你如何设置或重置一点 这是一个很简单的问题 我也回答了 之后 他们问我如何做同样的事情 但不分支 我不知道什么是分支 我搜索并发现位摆弄黑客 http graphics stanford edu 7Eseander
  • 字节数组的快速位移 - CMAC 子键

    我需要尽可能快地实现 16 字节数组的左移JavaCard 我尝试了这段代码 private static final void rotateLeft final byte output final byte input short car
  • C 中的位移位

    如果与有符号整数对应的位模式右移 则 1 vacant bit will be filled by the sign bit 2 vacant bit will be filled by 0 3 The outcome is impleme
  • 将 4 个字节转换为无符号 32 位整数并将其存储在 long 中

    我正在尝试用 Java 读取二进制文件 我需要读取无符号 8 位值 无符号 16 位值和无符号 32 位值的方法 执行此操作的最佳 最快 最美观的代码 是什么 我在 C 中做到了这一点 并做了类似的事情 uint8 t buffer uin

随机推荐