这个位运算符代码是副作用 (K & R C book 中使用的术语) 还是与机器相关的处理指令?

这里有两个代码似乎在做同样的事情,但它没有。当运行并将输出与跟踪进行比较时,这两种不同会带来混乱,因为第1 代码处理似乎是与机器相关的代码。请看两个代码 代码 1:- 无符号 char c = ((~ 0 <<3)>> 4) <<1); Printf (“% d”,c); 输出:-254 代码 2:- 无符号 char c = (~ 0 <3); C>> = 4; C <= 1; Printf (“% d”,c); 输出:-。30 上面代码的输出是不一样的。 不仅这个代码 (第1 代码) 会引起混乱,而且所有类型的代码都涉及单行多位移位运算符,会产生意想不到的结果。 第2 代码是正确的。 请在您的机器上运行此代码并验证上述输出 和/或 解释为什么这些输出不一样。 或者 最后,我们必须了解,我们不应该在代码中应用多个按位移位运算符。 谢谢 ……

共5个回答,已解决, 标签: c bit-manipulation
(X | y)-y 为什么不能简单地是 x 或者甚至是 &#39;x | 0&#39;

我正在读一个内核代码,在一个地方我看到了一个表达式if语句类 如果 (值 = = (SPINLOCK_SHARED | 1)-1) { ............ } 在哪里SPINLOCK_SHARED = 0x80000000是预定义的常数。 我想知道为什么我们需要(SPINLOCK_SHARED | 1) - 1-用于类型转换的目的?表达式的结果将是 80000000-与 0x80000000 相同,不是吗?然而,为什么 ORing 1 和减去 1 很重要呢? 有一种感觉,好像我错过了得到一些东西.. ……

共5个回答, 标签: c bit-manipulation
将 64 位整数中的 8 位整数并行减去 1

如果我有一个 64 位整数,我解释为 8 个元素的 8 位整数数组。我需要减去常数1在处理溢出时,每个打包的整数都不会影响另一个元素的结果。 我现在有这个代码,它可以工作,但是我需要一个解决方案,它可以并行减少每个打包的 8 位整数,并且不进行内存访问。我可以使用 SIMD 指令psubb在 x86 中,并行减去打包的 8 位整数,但是我编码的平台不支持 SIMD 指令。 Uint64_t sub (uint64_t arg) { Uint8_t * 打包 = (uint8_t *) & arg; 对于 (size_t i = 0; i <sizeof (uint64_t); i) { 分组 [i]-= 1; } 返回 arg; } 我想你可以用位运算符做到这一点,但我不确定。我正在寻找一个不使用 SIMD 指令的解决方案。我正在寻找一个 C 或 C 的解决方案,它是相当可移植的,或者只是它背后的理论,所以我可以实现我自己的解决方案。 ……

共5个回答,已解决, 标签: c++ c bit-manipulation
给定 32 位数字,将每个字节按某个因子缩放的有效方法是什么?

给定一个 0x12345678 (例如,RGBW 颜色值) 的 uint 数字,我如何高效并动态缩放其中的每个字节 (给定缩放因子)0 (或等效整数除数)? 我知道我可以用更长的时间来做到这一点 (也许通过一个结构将数字分解成它的组件,然后依次循环来操纵每个组件), 但是,有没有办法在不循环的情况下更快地完成它?(静态值映射是另一种方式,但最好使用动态方法。) 编辑: 嵌入数百或数千像素 (不是数百万像素) 的 C (C 想法也很有趣)。特别是缩放 RGBW 发光二极管。 还有一件事 -- 这是 gcc 的,所以允许打板 [https://gcc.gnu.org/onlinedocs/gcc/Optimize-Options.html#Type-punning] (我已经把它用于类似的事情了 -- 我只是想看看是否有更好的方法)。 再次编辑: 这是针对嵌入式平台 (微控制器) 的。虽然我都在寻找有助于更广泛受众的答案,但我特意在语言和算法的上下文中询问了这一点,而不是针对特定平台和指令集的优化, 由于特定于平台的优化可能会有所不同。 ……

共3个回答, 标签: c++ c bit-manipulation
对于给定的两个整数 A 和 B,找到一对数字 X 和 Y,使得 a = X * Y 和 B = X xor Y

我正在努力解决这个问题,我在一本竞争激烈的编程书中找到了这个问题,但是没有一个解决方案。 对于给定的两个整数一个和B(可以适合 64 位整数类型),其中一个是奇怪的,找到一对数字 X 和 Y,这样一个= X * Y 和B= X xor Y。我的方法是列出 A 的所有除数,并尝试将 sqrt (A) 下的数字与 sqrt (A) 上的数字相乘一个看看他们的 xor 是否等于B 。但我不知道这是否足够有效。这个问题的好解决方案/算法是什么? ……

共3个回答,已解决, 标签: algorithm bit-manipulation
按位否定后右移的意外结果

我预计下面的代码将输出 10 (~port) , 因为 10100101 等于所以, 当我们正确地转移它 4 由我们得到是 00001010 10 。但输出是 250 !为什么? int main() { uint8_t port = 0x5a; uint8_t result_8 = (~port) >> 4; //result_8 = result_8 >> 4; printf("%i", result_8); return 0; } ……

共1个回答,已解决, 标签: c bit-manipulation
如何考虑 Python 的负数按位操作?

我发现很难考虑 Python (和 Python3) 的无限精度负数和按位运算。它不是 32 位或 64 位。的1左边的可以被认为是 “无限多”。这不是很确定,这就是为什么有时很难思考它是如何工作的。 似乎一种可行的方法是: 总是让它更多,比如如果你在处理有 67 位的正整数, 然后想想他们的操作与负数有 96 位或 128 位。这是一个正确的思考方式吗?规格中有什么说明它是如何工作的或者应该考虑的吗? (例如内部实现只考虑正整数,而只将负数视为 “多 1 位”?) ……

共1个回答, 标签: python python-3.x bit-manipulation negative-number