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

2023-11-27

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


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

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

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

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

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

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

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

  • 检查位掩码的特定位

    我正在与Bitmasks in python 据我所知 这些是整数数组 当它们解压缩为二进制格式时 它们会告诉您数组中给定元素的 32 位中的哪一个被设置 1 我想知道检查数组的任何元素是否设置了 4 个特定位的最快方法 我不关心其余的 我
  • 将位的字符串表示形式转换为字节

    我刚刚开始学习文件压缩 但遇到了一些障碍 我有一个应用程序将诸如 程序 之类的字符串编码为压缩的二进制表示形式 010100111111011000 请注意 这仍然存储为字符串 Encoding g 111 r 10 a 110 p 010
  • 按位运算符的结果是如何产生的?

    我很惊讶我在谷歌上找不到这个听起来简单的问题的答案 在检查了大约十几个不同的页面之后 我只想在这里问 根据这一页 http www leepoint net notes java data expressions bitops html 3
  • 如果可能的话,如何在 C 中定义 2 位数字?

    对于我的大学过程 我正在模拟一个称为随机顺序吸附的过程 我必须做的一件事是随机地将正方形 不能重叠 放置到格子上 直到没有更多空间为止 重复该过程几次以找到平均 干扰 覆盖率 基本上我正在对一个大的整数数组执行操作 其中存在 3 个可能的值
  • 声明按位运算的掩码

    我是这样的低级操作的新手 我希望有人能指出我在这里犯的明显错误 Input value 00111100 I want to get the value of the bits at indexes 1 3 i e 0111 byte ma
  • 使用乘法执行整数除法[重复]

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

    是否有按位解决方案来查找仅设置一个位的掩码中第一个设置位的索引 例如对于 8 则为 3 对于 16 gt 4 依此类推 请不要循环 我能想到的最佳解决方案是创建位到索引的映射 function firstBit x return Math
  • 如何编写恒定时间函数将最高有效位复制到所有位

    我想用 C 语言编写一个函数 它采用以下的 MSBuint8 t 如果已设置 则返回0xFF如果不0x00 简而言之 它返回一个整数 其中所有位都设置为与 MSB 相同的值 但我想以完全恒定的时间方式来完成它 没有分支 没有数组偏移 只是数
  • 如何使用按位运算根据另外两个字节来分配一个字节的特定位? (根据蒙版进行位混合)

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

    我想对二进制数的两个字符串表示执行按位或 但我不知道如何将字符串转换为原始二进制 a 010110 b 100000 a b 应该产生 110110 然后我想计算 on 位的数量 这应该返回 4 您可以使用内置的将字符串转换为二进制int
  • NASM 轮班操作员

    您将如何在寄存器上进行 NASM 中的位移位 我读了手册 它似乎只提到了这些操作员 gt gt lt lt 当我尝试使用它们时 NASM 抱怨移位运算符处理标量值 您能解释什么是标量值并举例说明如何使用 gt gt and lt lt 另外
  • 在 C++ 中将 64 位值左移 64 位给出奇怪的结果[重复]

    这个问题在这里已经有答案了 可能的重复 64位移位问题 https stackoverflow com questions 1024968 64bit shift problem 我在 Windows 8 64 位上使用 Visual St
  • 如何快速将 Int16 转换为两个 UInt8 字节

    我有一些二进制数据 将两个字节值编码为有符号整数 bytes 1 255 0xFF bytes 2 251 0xF1 Decoding 这相当简单 我可以提取一个Int16这些字节的值 Int16 bytes 1 lt lt 8 Int16
  • 如何看待Python的负数按位运算?

    我发现很难思考 Python 和 Python3 的无限精度负数和按位运算 它不是 32 位或 64 位 这1左边的 s 可以被认为是 无穷多个 它不是很明确 这就是为什么有时很难思考它是如何运作的 似乎一种可行的方法是 总是让它更多 例如
  • 这个按位运算如何检查 2 的幂?

    我正在看一些应该很简单的代码 但我的数学在这里严重失败 下面是一个使用以下条件检查数字是否为 2 的幂的条件 if num 1 num num 1 make num pow of 2 我的问题是 如何在 num 和 num 1 之间使用按位
  • 使用按位运算符相乘

    我想知道如何使用按位运算符将一系列二进制位相乘 但是 我有兴趣这样做来查找二进制值的十进制小数值 这是我正在尝试做的一个例子 假设 1010010 我想使用每个单独的位 以便将其计算为 1 2 1 0 2 2 1 2 3 0 2 4 虽然我
  • 按位运算符简单地翻转整数中的所有位?

    我必须翻转整数的二进制表示形式中的所有位 鉴于 10101 输出应该是 01010 当与整数一起使用时 完成此操作的按位运算符是什么 例如 如果我正在编写类似的方法int flipBits int n 什么会进入身体 我只需要翻转数字中已经
  • 字节数组的快速位移 - CMAC 子键

    我需要尽可能快地实现 16 字节数组的左移JavaCard 我尝试了这段代码 private static final void rotateLeft final byte output final byte input short car
  • 用于在 n LSBits 之后清除 m 位的掩码

    我在一次采访中被问到这个问题 要清除 16 位整数的 n 位之后的 m 位 假设数字是 10010010010100101 清除 LSBit 中 5 位后的三位 之前 1001100111011001 之后 1001100100011001
  • 如何在 JavaScript 中将 ArrayBuffer 与 DataView 结合使用

    我见过的关于 ArrayBuffer 的唯一真正的教程来自HTML5摇滚 https www html5rocks com en tutorials webgl typed arrays 但我特别想知道如何操作各个字节 例如 这个carto

随机推荐