bit-manipulation相关内容

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 中的整数中找到最高设置位 (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 上)这样的指令几乎肯定会对于单个整数最快.其他一些 ..

使用 ABAP 进行位移

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

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

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

为什么 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开发

使用 ABAP 进行位移

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

在 JavaCard 中的 64 位字字节数组上向左旋转

我正在尝试对当前在 JavaCard 智能卡中表示为 8 个字节的字节数组的 64 位字的任意旋转量执行向左旋转 (ROTL) 操作. 丑陋的方法是在表示为 8 字节数组的 64 位字上硬​​编码 ROTL 的所有 64 种可能排列,但这只会使整个代码库膨胀. 如何使它更精简,以便我可以使用 byte 对 64 位字(在字节数组中)按需即时执行任意数量的 ROTL 操作和 short ..
发布时间:2021-11-25 07:29:25 C#