我正在摆弄JavaScript中的按位运算符,我发现有一件事值得注意.
在按位或运算符返回1作为输出比特,如果两个输入比特中的一个是1.所以x | 0总是返回x,因为| 0没有效果:
( 1 | 0 ) === 1( 0 | 0 ) === 0但是,当我计算时Infinity | 0,我得到了0.这在我看来是令人惊讶的,因为通过上面的应该得到Infinity.毕竟,( x | 0 ) === x.
我无法在ECMAscript规范中找到明确定义的位置,因此我想知道究竟是什么意思( Infinity | 0 ) === 0.也许Infinity是存储在内存中的方式?如果是这样,怎么仍然可以做一个| 0操作导致它返回0而不| 0应该做任何事情?
javascript bit-manipulation bitwise-operators infinity bitwise-or
Java有二进制或 |与二进制和 &运营商:
int a = 5 | 10;
int b = 5 & 10;
Run Code Online (Sandbox Code Playgroud)
它们似乎不适用于Kotlin:
val a = 5 | 10;
val b = 5 & 10;
Run Code Online (Sandbox Code Playgroud)
如何在Kotlin中使用Java的按位运算符?
我知道这||代表逻辑操作"或",但我很好奇是否有人知道选择该符号的历史.是不是因为它碰巧是键盘上未使用的符号?
说我有这个代码:
unsigned int func1();
unsigned int func2();
unsigned int func3();
unsigned int x = func1() | func2() | func3();
Run Code Online (Sandbox Code Playgroud)
C++是否保证首先调用func1(),然后调用func2(),然后调用func3()?
或者是否允许编译器以任何顺序调用函数?
此外,编译器是否允许在此处实现短路优化?(例如,如果func1()返回〜0,编译器是否可以决定不打扰调用func2()或func3(),因为它知道它们的返回值不可能影响分配给x的值?)
我有以下练习:数字n0到n7是二进制系统中表示的字节.任务是一点点掉到底部,或者如果它遇到另一个位,它会保持在它之上.这是一个视觉示例:

我意识到如果我对从n0到n7的所有数字应用Bitwise OR,它总是n7的正确结果:
n7 = n0 | n1 | n2 | n3 | n4 | n5 | n6 | n7;
Console.WriteLine(n7); // n7 = 236
Run Code Online (Sandbox Code Playgroud)
不幸的是,我想不出其余字节n6,n5,n4,n3,n2,n1,n0的正确方法.你有什么想法?
在AVX中,有两个指令可以执行按位或VORPD和VORPS.文档说:
VORPD (VEX.256 encoded version)
DEST[63:0] <- SRC1[63:0] BITWISE OR SRC2[63:0]
DEST[127:64] <- SRC1[127:64] BITWISE OR SRC2[127:64]
DEST[191:128] <- SRC1[191:128] BITWISE OR SRC2[191:128]
DEST[255:192] <- SRC1[255:192] BITWISE OR SRC2[255:192]
Run Code Online (Sandbox Code Playgroud)
和
VORPS (VEX.256 encoded version)
DEST[31:0] <- SRC1[31:0] BITWISE OR SRC2[31:0]
DEST[63:32] <- SRC1[63:32] BITWISE OR SRC2[63:32]
DEST[95:64] <- SRC1[95:64] BITWISE OR SRC2[95:64]
DEST[127:96] <- SRC1[127:96] BITWISE OR SRC2[127:96]
DEST[159:128] <- SRC1[159:128] BITWISE OR SRC2[159:128]
DEST[191:160] <- SRC1[191:160] BITWISE OR SRC2[191:160]
DEST[223:192] <- SRC1[223:192] BITWISE OR SRC2[223:192]
DEST[255:224] <- SRC1[255:224] BITWISE …Run Code Online (Sandbox Code Playgroud) 当我给变量这样的值:e = 17|-15;,我在编译后得到-15作为答案.我无法理解c ++的算术运算.它如何对负小数执行逐位OR运算?
我有两个相等长度(<= 500)的字符串(1和0),并希望对这些字符串应用逻辑OR.
我应该如何处理这个问题.我正在使用c#.
当我考虑显而易见的解决方案时,读取每个字符并应用OR | 对他们来说,我必须处理apx,250000个字符串,每个长度为500.这会扼杀我的表现.
表现是我主要关注的问题.
提前致谢!
我正在尝试处理位板,这需要我在64位无符号整数中设置一个特定的位.要设置位i,我对所讨论的位板执行按位OR运算,左移数字.
#include <stdint.h>
uint64_t kings = 0ULL; // Also tried unsigned long long int before.
kings |= 1 << i;
Run Code Online (Sandbox Code Playgroud)
它从第0位到第31位工作正常,但不能用于第32位到第63位.我怀疑这是因为右侧的评估恰好是32位整数.因此,我尝试了一个临时变量.
uint64_t temp = 0ULL;
temp |= 1 << i;
Run Code Online (Sandbox Code Playgroud)
也许它仍然将右侧评估为32位整数,或者它是我无法弄清楚的其他问题.要输出整数,我使用的是std :: bitset <64>.例如:
uint64_t kings = 0ULL;
kings |= 1 << 3;
kings |= 1 << 59;
Run Code Online (Sandbox Code Playgroud)
预期小数值:576460752303423496
实际:8
std::bitset<64> x(kings);
std::cout << x;
Run Code Online (Sandbox Code Playgroud)
位值:0000000000000000000000000000000000000000000000000000000000001000
显然,只有国王| = 1 << 3; 工作正常.
总之,第32到63位有什么问题,我该如何解决?
遗憾的是,这个有效的代码被 TSLint 的默认设置认为是疏忽的:
export const NO_FLAG: number = 0x0000;
export const DESTROY_FLAG: number = 0x0001;
export const NULL_FLAG: number = 0x0100;
export const START_FLAG: number = 0x0200;
export const STOP_FLAG: number = 0x0400;
export function getPackedFlags(destroy: boolean,
nullThing: boolean,
start: boolean,
stop: boolean): number {
const bitFlags: number = ((destroy) ? DESTROY_FLAG: NO_FLAG) |
((nullThing) ? NULL_FLAG: NO_FLAG) |
((start) ? START_FLAG: NO_FLAG) |
((stop) ? STOP_FLAG: NO_FLAG);
return bitFlags;
}
Run Code Online (Sandbox Code Playgroud)
执行上述操作会产生这种输出:
tslint --project ./tsconfig.json --format verbose --force
ERROR: (no-bitwise) …Run Code Online (Sandbox Code Playgroud) bitwise-or ×10
c++ ×3
c# ×2
avx ×1
bit-shift ×1
bitboard ×1
bitwise-and ×1
history ×1
infinity ×1
java ×1
javascript ×1
kotlin ×1
lint ×1
logical-or ×1
operators ×1
string ×1
syntax ×1
tslint ×1
typescript ×1