标签: bit-manipulation

并行地将 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;
}
Run Code Online (Sandbox Code Playgroud)

我认为你可以用按位运算符来做到这一点,但我不确定。我正在寻找一种不使用 SIMD 指令的解决方案。我正在寻找一个非常便携的 C 或 C++ 解决方案,或者只是它背后的理论,这样我就可以实现我自己的解决方案。

c c++ bit-manipulation simd swar

79
推荐指数
5
解决办法
5017
查看次数

在字节中设置特定位

我正在尝试在Java字节变量中设置位.它确实提供了类似的方法.setBit(i).有谁知道我怎么能意识到这一点?

我可以通过给定的字节逐位迭代:

if( (my_byte & (1 << i)) == 0 ){

}
Run Code Online (Sandbox Code Playgroud)

但是我不能把这个位置设置为1或0,可以吗?

java byte bit-manipulation

78
推荐指数
5
解决办法
7万
查看次数

增加'蒙面'位集

我目前正在编写一个树枚举器,我遇到了以下问题:

我正在查看屏蔽的位集,即位集,其中设置位是掩码的子集,即0000101使用掩码1010101.我想要完成的是增加位集,但仅限于屏蔽位.在这个例子中,结果将是0010000.为了使它更清晰一点,只提取掩码位,0011即将0100它们递增并再次分配给掩码位,给出0010000.

有没有人看到一种有效的方法来做到这一点,没有使用bitcans和前缀掩码的组合手动实现操作?

c c++ bit-manipulation intrinsics

78
推荐指数
3
解决办法
3415
查看次数

解释这个片段,它在不使用if-else或任何其他比较运算符的情况下找到最多两个整数?

找到最多两个数字.您不应该使用if-else或任何其他比较运算符.我在网上公告板上发现了这个问题,所以我想我应该在StackOverflow中询问

示例输入:5,10输出:10

我找到了这个解决方案,有人可以帮我理解这些代码行

int getMax(int a, int b) {  
    int c = a - b;  
    int k = (c >> 31) & 0x1;  
    int max = a - k * c;  
    return max;  
}
Run Code Online (Sandbox Code Playgroud)

c algorithm math bit-manipulation max

75
推荐指数
6
解决办法
7万
查看次数

给定一个整数,如何使用bit-twiddling找到下一个最大的2的幂?

如果我有一个整数n,我怎样才能找到的下一个号码k > n,使得k = 2^i,其中一些i的元件N由按位移动或逻辑.

示例:如果我有n = 123,我怎么能找到k = 128,哪个是2的幂,而不是124哪个只能被2整除.这应该很简单,但它让我望而却步.

language-agnostic bit-manipulation

73
推荐指数
6
解决办法
4万
查看次数

在大集合中有效地找到具有低汉明距离的二进制字符串

问题:

给定一个大的(~1亿)无符号32位整数列表,无符号32位整数输入值和最大汉明距离,返回在输入值的指定汉明距离内的所有列表成员.

保持列表的实际数据结构是开放的,性能要求决定了内存中的解决方案,构建数据结构的成本是次要的,查询数据结构的低成本是至关重要的.

例:

For a maximum Hamming Distance of 1 (values typically will be quite small)

And input: 
00001000100000000000000001111101

The values:
01001000100000000000000001111101 
00001000100000000010000001111101 

should match because there is only 1 position in which the bits are different.

11001000100000000010000001111101

should not match because 3 bit positions are different.
Run Code Online (Sandbox Code Playgroud)

到目前为止我的想法:

对于汉明距离为0的退化情况,只需使用排序列表并对特定输入值进行二分搜索.

如果汉明距离只有1,我可以翻转原始输入中的每一位并重复上述32次.

如何有效地(不扫描整个列表)发现汉明距离> 1的列表成员.

algorithm bit-manipulation bitwise-operators hamming-distance

72
推荐指数
2
解决办法
2万
查看次数

如何在SQL Server中翻转一下?

我正在尝试在SQL Server中执行按位NOT.我想做这样的事情:

update foo
set Sync = NOT @IsNew
Run Code Online (Sandbox Code Playgroud)

注意:在我结束之前,我开始写这个并找到我自己问题的答案.我仍然想与社区分享,因为MSDN上缺少这篇文档(直到我将其添加到社区内容中).

sql sql-server bit-manipulation

71
推荐指数
3
解决办法
2万
查看次数

操纵Java/Android color int的alpha字节

如果我在Java中使用int作为Android颜色(用于在Canvas上绘图),我该如何操作该int的alpha组件?例如,我如何使用操作来执行此操作:

int myOpaqueColor = 0xFFFFFF;
float factor = 0;
int myTransparentColor = operationThatChangesAlphaBytes(myOpaqueColor, factor);
//myTransparentColor should now = 0x00FFFFFF;
Run Code Online (Sandbox Code Playgroud)

理想情况下,将这些第一个字节乘以任何数字factor都是很好的,而不是仅仅将字节设置为静态值.

java android bit-manipulation

69
推荐指数
4
解决办法
3万
查看次数

XOR变量交换如何工作?

有人可以向我解释如何在没有临时变量的情况下对两个变量进行XOR交换吗?

void xorSwap (int *x, int *y)
{
    if (x != y) {
        *x ^= *y;
        *y ^= *x;
        *x ^= *y;
    }
}
Run Code Online (Sandbox Code Playgroud)

我明白它做了什么,但有人可以告诉我它是如何工作的逻辑吗?

language-agnostic bit-manipulation xor

68
推荐指数
8
解决办法
2万
查看次数

按位运算符和"字节序"

字节操作,字节顺序是否重要?任一逻辑或移位?

我正在做作业关于位运算符,我不能做出正面或反面就可以了,我想我已经相当挂了字节序.也就是说,我正在使用一个小端机器(像大多数人一样),但是这需要考虑还是浪费的事实?

如果重要,我正在使用C.

c bit-manipulation bit-shift endianness

68
推荐指数
3
解决办法
2万
查看次数