bit-manipulation相关内容

了解按位与运算符

我一直在 Kochan 的书“Objective-C 中的编程"中阅读有关 Objective-C 中的位运算符的内容. 我对这部分感到非常困惑,尽管到目前为止我已经真正理解了呈现给我的大多数其他内容. 这是书中引述: 按位与运算符 按位与常用于掩码操作.也就是说,这个运算符可以很容易地用于将数据项的特定位设置为 0.例如,语句 w3 = w1 &3; 将 w1 的值与 ..
发布时间:2021-12-02 18:32:33 C/C++开发

加速 Python 中的位串/位操作?

我使用 Sieve of Eratosthenes 和 Python 3.1 编写了一个素数生成器.代码在 ideone.com 上以 0.32 秒正确且优雅地运行,以生成最多 1,000,000 的素数. # from bitstring import BitStringdef prime_numbers(limit=1000000):'''质数生成器.产量系列2, 3, 5, 7, 11, ..
发布时间:2021-12-02 17:29:29 其他开发

C中的移位运算符(<<、>>)是算术还是逻辑?

在 C 中,移位运算符 (, >>>) 是算术还是逻辑? 解决方案 根据 K&R 第 2 版 结果取决于有符号值右移的实现. 维基百科说 C/C++“通常"对有符号值实现算术移位. 基本上,您需要测试编译器或不依赖它.我对当前 MS C++ 编译器的 VS2008 帮助说他们的编译器进行了算术移位. ..
发布时间:2021-12-02 08:05:51 其他开发

有符号整数的算术位移

我试图弄清楚算术位移运算符在 C 中的工作原理,以及它将如何影响有符号的 32 位整数. 为了简单起见,假设我们在一个字节(8 位)内工作: x = 1101.0101MSB[ 1101.0101 ]LSB 阅读 Stack Overflow 和一些网站上的其他帖子,我发现:> 将移向 LSB(在我 ..
发布时间:2021-12-02 00:09:37 其他开发

C 中位反转的高效算法(从 MSB->LSB 到 LSB->MSB)

实现以下目标的最有效算法是什么: 0010 0000 =>0000 0100 转换是从MSB->LSB到LSB->MSB.所有位都必须反转;也就是说,这不是字节序交换. 解决方案 注意:下面的所有算法都是用 C 语言编写的,但应该可以移植到您选择的语言中(不要看我当他们没有那么快时:) 选项 低内存(32 位 int,32 位机器)(来自 ..
发布时间:2021-12-02 00:06:55 其他开发

设置的最低有效位的位置

我正在寻找一种有效的方法来确定设置在整数中的最低有效位的位置,例如对于 0x0FF0,它将是 4. 一个简单的实现是这样的: unsigned GetLowestBitPos(无符号值){断言(值!= 0);//单独处理无符号位置 = 0;while (!(value & 1)){值>>=1;++位置;}返回位置;} 任何想法如何从中挤出一些周期? (注意:这个问题是针对喜欢这种东 ..
发布时间:2021-12-01 15:45:23 C/C++开发

C++ 中循环移位(旋转)操作的最佳实践

左移和右移运算符(>)在 C++ 中已经可用.但是,我不知道如何执行循环移位或旋转操作. 如何进行“向左旋转"和“向右旋转"等操作? 这里向右旋转两次 初始 -->1000 0011 0100 0010 应该导致: 最终 -->1010 0000 1101 0000 举个例子会有帮助. (编者注:如果旋转计数为零,则在 C 中表达旋转的许多常见方法都会遇到未定 ..
发布时间:2021-12-01 15:06:36 C/C++开发

您如何设置、清除和切换单个位?

你如何设置、清除和稍微切换? 解决方案 设置一点 使用按位或运算符 (|) 设置位. number |= 1UL 这将设置 number 的 nth 位.n 应该为零,如果你想设置 1st 位等等直到 n-1,如果你想设置 nth 位. 如果number 比unsigned long 更宽,则使用1ULL;1UL 在评估 1UL ..
发布时间:2021-12-01 14:40:47 C/C++开发

如何仅使用位移和加法进行乘法和除法?

如何仅使用位移和加法进行乘法和除法? 解决方案 要在加法和移位方面进行乘法,您需要将其中一个数字分解为 2 的幂,如下所示: 21 * 5 = 10101_2 * 101_2(初始步骤)= 10101_2 * (1 * 2^2 + 0 * 2^1 + 1 * 2^0)= 10101_2 * 2^2 + 10101_2 * 2^0= 10101_2 <<2 + 10101_2 <<0(分解 ..
发布时间:2021-11-30 11:11:41 其他开发

在 C 中的整数中找到最高设置位 (msb) 的最快/最有效方法是什么?

如果我有一个整数 n,我想知道最高位的位置(也就是说,如果最低有效位在右边,我想知道最左边的位是 a1)、最快/最有效的查找方法是什么? 我知道POSIX支持strings.h中的ffs()方法来查找第一个设置位,但是好像没有对应的fls() 方法. 是否有一些我遗漏的非常明显的方法? 如果您不能使用 POSIX 函数来实现可移植性怎么办? 编辑:适用于 32 位和 64 ..
发布时间:2021-11-26 23:52:18 其他开发

如何计算 32 位整数中设置的位数?

代表数字 7 的 8 位如下所示: 00000111 设置了三个位. 确定 32 位整数中设置位数的算法是什么? 解决方案 这被称为“汉明权重"、“popcount"或“横向加法". 有些 CPU 有一个单一的内置指令来完成它,而另一些 CPU 则具有作用于位向量的并行指令.像 x86 的 popcnt(在支持它的 CPU 上)这样的指令几乎肯定会对于单个整数最快.其他一些 ..
发布时间:2021-11-26 23:49:02 其他开发

使用 ABAP 进行位移

我正在尝试将一些需要算术和逻辑位移的 Java 代码移植到 ABAP.据我所知,ABAP 只支持按位 NOT、AND、OR 和 XOR 运算. 有谁知道用 ABAP 实现这种转变的另一种方法?是否有可能只使用 NOT、AND、OR 和 XOR 运算来获得与移位相同的结果? 解决方案 编辑:现在可以在这里找到更新的代码:github 要点 ..
发布时间:2021-11-26 15:45:50 其他开发

“隔离"来自 64 位数字的特定行/列/对角线

好的,让我们考虑一个 64 位数字,它的位形成一个 8x8 表. 例如 0 1 1 0 1 0 1 0 0 1 1 0 1 0 1 1 0 1 1 1 1 0 1 0 0 1 1 0 1 0 1 0 1 1 10 1 0 1 0 0 1 1 0 1 0 1 0 0 1 1 0 1 1 1 0 0 1 1 0 1 0 1 0 写成 a b c d e f g h--------- ..
发布时间:2021-11-26 14:58:11 C/C++开发

将 32 位变量移位 32 位有什么不好?

我最近拿起了 Bruce Schneier 的 Applied Cryptography 的副本,读得很好.我现在了解书中概述的几种算法是如何工作的,我想开始用 C 实现其中的一些算法. 许多算法的共同点是将 x 位密钥划分为几个较小的 y 位密钥.例如,Blowfish 的密钥 X 是 64 位的,但是您需要将其分成两个 32 位的一半;Xl 和 Xr. 这就是我被卡住的地方.我在 ..
发布时间:2021-11-26 14:35:21 其他开发

64位整数的log2的快速计算

一个很棒的编程资源 Bit Twiddling Hacks,提出了(此处)以下方法计算 32 位整数的 log2: #define LT(n) n, n, n, n, n, n, n, n, n, n, n, n, n, n, n, n静态常量字符 LogTable256[256] ={-1, 0, 1, 1, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 3,LT(4), ..
发布时间:2021-11-26 14:33:58 其他开发

为什么 abs(0x80000000) == 0x80000000?

我刚开始阅读黑客的喜悦将 abs(-231) 定义为 -231.这是为什么? 我在几个不同的系统上尝试了 printf("%x", abs(0x80000000)) 并且在所有系统上都返回 0x80000000. 解决方案 对于 32 位数据类型,没有 +2^31 的表达式,因为最大的数字是 2^31-1 ...阅读更多关于 ..
发布时间:2021-11-26 14:19:51 其他开发

为什么 BinaryReader.ReadUInt32() 反转位模式?

我正在尝试使用 BinaryReader 类读取二进制文件,我需要将它作为 UInt32 块读取,然后进行一些位移等后记. 但是,由于某种原因,当我使用 ReadUInt32 方法时,位顺序颠倒了. 例如,如果我有一个文件,其中前四个字节在十六进制中看起来像这样,0x12345678,它们在被 ReadUInt32 读取后最终是这样的:0x78563412. 如果我使用 Read ..
发布时间:2021-11-26 14:12:52 C#/.NET

查找位数组中设置的最高有效位(最左侧)

我有一个位数组实现,其中第 0 个索引是数组中第一个字节的 MSB,第 8 个索引是第二个字节的 MSB,等等...... 找到在这个位数组中设置的第一位的快速方法是什么?我查找的所有相关解决方案都找到了第一个最不重要的位,但我需要第一个最重要的位.所以,给定 0x00A1,我想要 8(因为它是左起第 9 位). 解决方案 GCC 有 __builtin_clz 在 x86/x64 ..
发布时间:2021-11-26 14:00:59 其他开发

在 Java 中移位是否比乘法和除法更快?.网?

如果您碰巧使用 2 的幂,那么在大多数甚至所有 CPU 上左右移动位显然比乘法和除法运算快.但是,它会降低某些读者和某些算法的代码清晰度.移位对于性能是否真的必要,或者我是否可以期望编译器或 VM 注意到这种情况并对其进行优化(特别是当 2 的幂是文字时)?我主要对 Java 和 .NET 行为感兴趣,但也欢迎深入了解其他语言实现. 解决方案 今天的大多数编译器所做的不仅仅是将乘法或除以二 ..
发布时间:2021-11-25 16:39:43 Java Web开发