cli*_*ick 127 javascript boolean-logic boolean bitwise-operators
我是一个只是为了好玩而编写代码的人,并没有在学术或专业环境中深入研究它,所以像这些按位运算符这样的东西真的让我感到厌烦.
我正在阅读一篇关于JavaScript的文章,它显然支持按位操作.我一直看到这个地方提到的这个操作,我试着去弄清楚究竟是什么,但我似乎根本没有得到它.那他们是什么?清楚的例子会很棒!:d
还有几个问题 - 按位运算的一些实际应用是什么?你何时可以使用它们?
Ed *_*rty 182
由于没有人提出过为什么这些有用的主题:
使用标志时,我经常使用按位运算.例如,如果要将一系列标志传递给某个操作(例如,File.Open,同时启用了读取模式和写入模式),则可以将它们作为单个值传递.这是通过在bitset(byte,short,int或long)中为每个可能的标志分配它自己的位来实现的.例如:
Read: 00000001
Write: 00000010
Run Code Online (Sandbox Code Playgroud)
因此,如果你想传递读和写,你将传递(READ | WRITE),然后将两者结合起来
00000011
Run Code Online (Sandbox Code Playgroud)
然后可以在另一端解密,如:
if ((flag & Read) != 0) { //...
Run Code Online (Sandbox Code Playgroud)
检查
00000011 &
00000001
Run Code Online (Sandbox Code Playgroud)
返回
00000001
Run Code Online (Sandbox Code Playgroud)
这不是0,因此该标志确实指定READ.
您可以使用XOR切换各种位.我在使用标志指定方向输入(向上,向下,向左,向右)时使用了这个.例如,如果一个精灵正在水平移动,我想让它转过来:
Up: 00000001
Down: 00000010
Left: 00000100
Right: 00001000
Current: 00000100
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我只是将当前值与(LEFT | RIGHT)进行异或,它将关闭LEFT和RIGHT.
在几种情况下,位移是有用的.
x << y
Run Code Online (Sandbox Code Playgroud)
是相同的
x*2 y
如果你需要快速乘以2的幂,但要注意将1位移入最高位 - 这使得数字为负数,除非它是无符号的.它在处理不同大小的数据时也很有用.例如,从四个字节读取整数:
int val = (A << 24) | (B << 16) | (C << 8) | D;
Run Code Online (Sandbox Code Playgroud)
假设A是最重要的字节而D是最小的.最终会:
A = 01000000
B = 00000101
C = 00101011
D = 11100011
val = 01000000 00000101 00101011 11100011
Run Code Online (Sandbox Code Playgroud)
颜色通常以这种方式存储(最重要的字节被忽略或用作Alpha):
A = 255 = 11111111
R = 21 = 00010101
G = 255 = 11111111
B = 0 = 00000000
Color = 11111111 00010101 11111111 00000000
Run Code Online (Sandbox Code Playgroud)
要再次找到这些值,只需将这些位向右移动直到它位于底部,然后屏蔽其余的高位:
Int Alpha = Color >> 24
Int Red = Color >> 16 & 0xFF
Int Green = Color >> 8 & 0xFF
Int Blue = Color & 0xFF
Run Code Online (Sandbox Code Playgroud)
0xFF与11111111相同.基本上,对于Red,你会这样做:
Color >> 16 = (filled in 00000000 00000000)11111111 00010101 (removed 11111111 00000000)
00000000 00000000 11111111 00010101 &
00000000 00000000 00000000 11111111 =
00000000 00000000 00000000 00010101 (The original value)
Run Code Online (Sandbox Code Playgroud)
pax*_*blo 27
按位运算符是一次运算的运算符.
仅当两个输入均为1时,AND才为1.
如果其中一个或多个输入为1,则OR为1.
仅当其中一个输入为1时,XOR才为1.
仅当输入为0时,NOT才为1.
这些可以最好地描述为真值表.输入的可能性是在顶部和左,所得位是四个(两个不因为它仅具有一个输入的情况下),在两个输入的交点中示出的一个值.
AND|0 1 OR|0 1
---+---- ---+----
0|0 0 0|0 1
1|0 1 1|1 1
XOR|0 1 NOT|0 1
---+---- ---+---
0|0 1 |1 0
1|1 0
Run Code Online (Sandbox Code Playgroud)
一个例子是如果你只想要一个整数的低4位,你和它15(二进制1111),所以:
203: 1100 1011
AND 15: 0000 1111
------------------
IS 11: 0000 1011
Run Code Online (Sandbox Code Playgroud)
Gre*_*ill 27
值得注意的是,作为其他答案列出的单位真值表一次只能处理一个或两个输入位.使用整数时会发生什么,例如:
int x = 5 & 6;
Run Code Online (Sandbox Code Playgroud)
答案在于每个输入的二进制扩展:
5 = 0 0 0 0 0 1 0 1
& 6 = 0 0 0 0 0 1 1 0
---------------------
0 0 0 0 0 1 0 0
Run Code Online (Sandbox Code Playgroud)
每列中的每对位都通过"AND"功能运行,以在底行给出相应的输出位.所以上面表达式的答案是4.CPU(在这个例子中)并行完成了8个独立的"AND"操作,每列一个.
我提到这个是因为我还记得有这个"AHA!" 多年前我了解这一点的那一刻.
Jef*_*man 15
这些是按位运算符,所有都支持JavaScript:
op1 & op2- AND如果两个位均为1,则运算符比较两位并生成结果1; 否则,它返回0.
op1 | op2- OR运算符比较两位,如果位互补,则生成1的结果; 否则,它返回0.
op1 ^ op2- EXCLUSIVE-OR运算符比较两位,如果其中一位为1则返回1,如果两位均为0或1,则返回0.
~op1- COMPLEMENT运算符用于反转操作数的所有位.
op1 << op2- SHIFT LEFT操作符向左移动位,丢弃最左边的位,并将最右边的位指定为0.每次向左移动都会有效地将op1乘以2.
op1 >> op2- SHIFT RIGHT运算符向右移动位,丢弃最右位,并将最左边的位赋值为0.每次向右移动都有效地将op1分成两半.最左边的符号位被保留.
op1 >>> op2- SHIFT RIGHT- ZERO FILL运算符将位向右移动,丢弃最右位,并将最左边的位赋值为0.每次向右移动都有效地将op1分成两半.最左边的符号位被丢弃.
| 归档时间: |
|
| 查看次数: |
19779 次 |
| 最近记录: |