如果我有一个 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++ 解决方案,或者只是它背后的理论,这样我就可以实现我自己的解决方案。
我正在尝试在Java字节变量中设置位.它确实提供了类似的方法.setBit(i)
.有谁知道我怎么能意识到这一点?
我可以通过给定的字节逐位迭代:
if( (my_byte & (1 << i)) == 0 ){
}
Run Code Online (Sandbox Code Playgroud)
但是我不能把这个位置设置为1或0,可以吗?
我目前正在编写一个树枚举器,我遇到了以下问题:
我正在查看屏蔽的位集,即位集,其中设置位是掩码的子集,即0000101
使用掩码1010101
.我想要完成的是增加位集,但仅限于屏蔽位.在这个例子中,结果将是0010000
.为了使它更清晰一点,只提取掩码位,0011
即将0100
它们递增并再次分配给掩码位,给出0010000
.
有没有人看到一种有效的方法来做到这一点,没有使用bitcans和前缀掩码的组合手动实现操作?
找到最多两个数字.您不应该使用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) 如果我有一个整数n
,我怎样才能找到的下一个号码k > n
,使得k = 2^i
,其中一些i
的元件N
由按位移动或逻辑.
示例:如果我有n = 123
,我怎么能找到k = 128
,哪个是2的幂,而不是124
哪个只能被2整除.这应该很简单,但它让我望而却步.
问题:
给定一个大的(~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
我正在尝试在SQL Server中执行按位NOT.我想做这样的事情:
update foo
set Sync = NOT @IsNew
Run Code Online (Sandbox Code Playgroud)
注意:在我结束之前,我开始写这个并找到我自己问题的答案.我仍然想与社区分享,因为MSDN上缺少这篇文档(直到我将其添加到社区内容中).
如果我在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
都是很好的,而不是仅仅将字节设置为静态值.
有人可以向我解释如何在没有临时变量的情况下对两个变量进行XOR交换吗?
void xorSwap (int *x, int *y)
{
if (x != y) {
*x ^= *y;
*y ^= *x;
*x ^= *y;
}
}
Run Code Online (Sandbox Code Playgroud)
我明白它做了什么,但有人可以告诉我它是如何工作的逻辑吗?
我正在做作业关于位运算符,我不能做出正面或反面就可以了,我想我已经相当挂了字节序.也就是说,我正在使用一个小端机器(像大多数人一样),但是这需要考虑还是浪费的事实?
如果重要,我正在使用C.
bit-manipulation ×10
c ×4
algorithm ×2
c++ ×2
java ×2
android ×1
bit-shift ×1
byte ×1
endianness ×1
intrinsics ×1
math ×1
max ×1
simd ×1
sql ×1
sql-server ×1
swar ×1
xor ×1