bit-manipulation相关内容
我使用 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,
..
在 C 中,移位运算符 (, >>>) 是算术还是逻辑? 解决方案 根据 K&R 第 2 版 结果取决于有符号值右移的实现. 维基百科说 C/C++“通常"对有符号值实现算术移位. 基本上,您需要测试编译器或不依赖它.我对当前 MS C++ 编译器的 VS2008 帮助说他们的编译器进行了算术移位.
..
我试图弄清楚算术位移运算符在 C 中的工作原理,以及它将如何影响有符号的 32 位整数. 为了简单起见,假设我们在一个字节(8 位)内工作: x = 1101.0101MSB[ 1101.0101 ]LSB 阅读 Stack Overflow 和一些网站上的其他帖子,我发现:> 将移向 LSB(在我
..
实现以下目标的最有效算法是什么: 0010 0000 =>0000 0100 转换是从MSB->LSB到LSB->MSB.所有位都必须反转;也就是说,这不是字节序交换. 解决方案 注意:下面的所有算法都是用 C 语言编写的,但应该可以移植到您选择的语言中(不要看我当他们没有那么快时:) 选项 低内存(32 位 int,32 位机器)(来自
..
我正在寻找一种有效的方法来确定设置在整数中的最低有效位的位置,例如对于 0x0FF0,它将是 4. 一个简单的实现是这样的: unsigned GetLowestBitPos(无符号值){断言(值!= 0);//单独处理无符号位置 = 0;while (!(value & 1)){值>>=1;++位置;}返回位置;} 任何想法如何从中挤出一些周期? (注意:这个问题是针对喜欢这种东
..
你如何设置、清除和稍微切换? 解决方案 设置一点 使用按位或运算符 (|) 设置位. number |= 1UL 这将设置 number 的 nth 位.n 应该为零,如果你想设置 1st 位等等直到 n-1,如果你想设置 nth 位. 如果number 比unsigned long 更宽,则使用1ULL;1UL 在评估 1UL
..
如何仅使用位移和加法进行乘法和除法? 解决方案 要在加法和移位方面进行乘法,您需要将其中一个数字分解为 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(分解
..
我正在解决一些关于 codeforces 的问题.通常我首先检查字符是大写还是小写英文字母,然后减去或添加 32 将其转换为相应的字母.但我发现有人做 ^= 32 做同样的事情.这是: char foo = 'a';富 ^= 32;字符栏 = 'A';酒吧 ^= 32;cout
..
如果我有一个整数 n,我想知道最高位的位置(也就是说,如果最低有效位在右边,我想知道最左边的位是 a1)、最快/最有效的查找方法是什么? 我知道POSIX支持strings.h中的ffs()方法来查找第一个设置位,但是好像没有对应的fls() 方法. 是否有一些我遗漏的非常明显的方法? 如果您不能使用 POSIX 函数来实现可移植性怎么办? 编辑:适用于 32 位和 64
..
代表数字 7 的 8 位如下所示: 00000111 设置了三个位. 确定 32 位整数中设置位数的算法是什么? 解决方案 这被称为“汉明权重"、“popcount"或“横向加法". 有些 CPU 有一个单一的内置指令来完成它,而另一些 CPU 则具有作用于位向量的并行指令.像 x86 的 popcnt(在支持它的 CPU 上)这样的指令几乎肯定会对于单个整数最快.其他一些
..
我正在尝试将一些需要算术和逻辑位移的 Java 代码移植到 ABAP.据我所知,ABAP 只支持按位 NOT、AND、OR 和 XOR 运算. 有谁知道用 ABAP 实现这种转变的另一种方法?是否有可能只使用 NOT、AND、OR 和 XOR 运算来获得与移位相同的结果? 解决方案 编辑:现在可以在这里找到更新的代码:github 要点
..
好的,让我们考虑一个 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---------
..
我最近拿起了 Bruce Schneier 的 Applied Cryptography 的副本,读得很好.我现在了解书中概述的几种算法是如何工作的,我想开始用 C 实现其中的一些算法. 许多算法的共同点是将 x 位密钥划分为几个较小的 y 位密钥.例如,Blowfish 的密钥 X 是 64 位的,但是您需要将其分成两个 32 位的一半;Xl 和 Xr. 这就是我被卡住的地方.我在
..
一个很棒的编程资源 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),
..
我刚开始阅读黑客的喜悦将 abs(-231) 定义为 -231.这是为什么? 我在几个不同的系统上尝试了 printf("%x", abs(0x80000000)) 并且在所有系统上都返回 0x80000000. 解决方案 对于 32 位数据类型,没有 +2^31 的表达式,因为最大的数字是 2^31-1 ...阅读更多关于
..
我正在尝试使用 BinaryReader 类读取二进制文件,我需要将它作为 UInt32 块读取,然后进行一些位移等后记. 但是,由于某种原因,当我使用 ReadUInt32 方法时,位顺序颠倒了. 例如,如果我有一个文件,其中前四个字节在十六进制中看起来像这样,0x12345678,它们在被 ReadUInt32 读取后最终是这样的:0x78563412. 如果我使用 Read
..
我有一个位数组实现,其中第 0 个索引是数组中第一个字节的 MSB,第 8 个索引是第二个字节的 MSB,等等...... 找到在这个位数组中设置的第一位的快速方法是什么?我查找的所有相关解决方案都找到了第一个最不重要的位,但我需要第一个最重要的位.所以,给定 0x00A1,我想要 8(因为它是左起第 9 位). 解决方案 GCC 有 __builtin_clz 在 x86/x64
..
如果您碰巧使用 2 的幂,那么在大多数甚至所有 CPU 上左右移动位显然比乘法和除法运算快.但是,它会降低某些读者和某些算法的代码清晰度.移位对于性能是否真的必要,或者我是否可以期望编译器或 VM 注意到这种情况并对其进行优化(特别是当 2 的幂是文字时)?我主要对 Java 和 .NET 行为感兴趣,但也欢迎深入了解其他语言实现. 解决方案 今天的大多数编译器所做的不仅仅是将乘法或除以二
..
我正在尝试将一些需要算术和逻辑位移的 Java 代码移植到 ABAP.据我所知,ABAP 只支持按位 NOT、AND、OR 和 XOR 运算. 有谁知道用 ABAP 实现这种转变的另一种方法?是否有可能只使用 NOT、AND、OR 和 XOR 运算来获得与移位相同的结果? 解决方案 编辑:现在可以在这里找到更新的代码:github 要点
..
我正在尝试对当前在 JavaCard 智能卡中表示为 8 个字节的字节数组的 64 位字的任意旋转量执行向左旋转 (ROTL) 操作. 丑陋的方法是在表示为 8 字节数组的 64 位字上硬编码 ROTL 的所有 64 种可能排列,但这只会使整个代码库膨胀. 如何使它更精简,以便我可以使用 byte 对 64 位字(在字节数组中)按需即时执行任意数量的 ROTL 操作和 short
..