Questions tagged «bit-manipulation»

单个位的操作。使用的运算符可能包括按位与,或,异或,非,左移和右移。

8
将64位整数中的压缩8位整数并行减1,SWAR不带硬件SIMD
如果我有一个64位整数,那么我会将其解释为具有8个元素的打包8位整数数组。我需要1在处理溢出时从每个压缩整数中减去常数,而一个元素的结果不会影响另一个元素的结果。 我现在有这段代码,它可以工作,但是我需要一个解决方案,它可以并行地对每个压缩的8位整数进行减法,并且不进行内存访问。在x86上,我可以使用类似的SIMD指令psubb,以并行方式减去打包的8位整数,但是我正在编码的平台不支持SIMD指令。(在这种情况下为RISC-V)。 因此,我正在尝试执行SWAR(寄存器中的SIMD)以手动取消a的字节之间的进位传播uint64_t,从而执行以下操作: uint64_t sub(uint64_t arg) { uint8_t* packed = (uint8_t*) &arg; for (size_t i = 0; i < sizeof(uint64_t); ++i) { packed[i] -= 1; } return arg; } 我认为您可以使用按位运算符来执行此操作,但我不确定。我正在寻找不使用SIMD指令的解决方案。我正在寻找一种可移植的C或C ++解决方案,或者只是其背后的理论,以便我可以实现自己的解决方案。
77 c++  c  bit-manipulation  simd  swar 


5
如何在SQL Server中翻转一下?
我正在尝试在SQL Server中执行按位NOT。我想做这样的事情: update foo set Sync = NOT @IsNew 注意:我开始写这篇文章,然后在完成之前找到了自己问题的答案。我仍然想与社区分享,因为MSDN上缺少此文档(直到我也将其添加到社区内容中)。


5
按位运算符和“字节序”
是否字节顺序在所有问题与位操作?任一逻辑或移位? 我正在从事按位运算符的作业,我无法在上面做任何事情,而且我想我对持久性很感兴趣。就是说,我使用的是小端机(就像大多数机器一样),但这是否需要考虑?或者这是一个浪费的事实? 万一重要,我正在使用C。


12
在Java中移位位是否比乘法和除法快?。净?[关闭]
已关闭。这个问题需要更加集中。它当前不接受答案。 想改善这个问题吗?更新问题,使其仅通过编辑此帖子来关注一个问题。 4年前关闭。 改善这个问题 如果您恰好使用2的幂,则在大多数(甚至甚至是所有)CPU上,向左和向右移位位显然比乘法和除法运算快。但是,对于某些阅读器和某些算法,这样做可能会降低代码的清晰度。移位确实是提高性能所必需的,还是我可以期望编译器或VM注意到这种情况并对其进行优化(特别是当2的幂是文字时)?我主要对Java和.NET的行为感兴趣,但也欢迎对其他语言实现有深入的了解。

6
(x | y)-y为什么不能简单地是x甚至`x | 0`
我正在阅读内核代码,在一个地方,我看到了一个语句内部的表达式,if例如 if (value == (SPINLOCK_SHARED | 1) - 1) { ............ } 其中SPINLOCK_SHARED = 0x80000000是预定义常数。 我想知道为什么我们需要(SPINLOCK_SHARED | 1) - 1-用于类型转换?表达式的结果将是80000000-与0x80000000相同,不是吗?但是,“或1”和“减1”为何重要? 感觉好像我想不到的东西..

3
对于给定的两个整数A和B,找到一对数字X和Y,使得A = X * Y和B = X x或Y
我正在为一本竞争激烈的编程书中的这个问题而苦苦挣扎,但没有解决方案。对于给定的两个整数A和B(可以适合64位整数类型),其中A是奇数,请找到一对数字X和Y,使得A = X * Y和B = X xorY。我的方法是列出A的所有约数,并尝试过的sqrt(A)下的sqrt(A)与数字配对数字,乘达一 ,看看他们的XOR等于乙。但是我不知道这是否足够有效。什么是解决这个问题的好方法/算法?

4
为什么C编译器会优化开关,以及是否有所不同
当我偶然发现一个奇怪的问题时,我正在从事一个个人项目。 在一个非常紧密的循环中,我有一个整数,其值在0到15之间。对于值0、1、8和9,我需要获取-1,对于值4、5、12和13,我需要获取1。 我转向godbolt检查一些选项,并惊讶于编译器似乎无法以与if链相同的方式优化switch语句。 链接在这里:https : //godbolt.org/z/WYVBFl 代码是: const int lookup[16] = {-1, -1, 0, 0, 1, 1, 0, 0, -1, -1, 0, 0, 1, 1, 0, 0}; int a(int num) { return lookup[num & 0xF]; } int b(int num) { num &= 0xF; if (num == 0 || num == …
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.