什么是按位运算符?
我是一个为了好玩而编写代码的人,在学术或者职业环境中都没有深入研究,所以像这些按位运算符这样的东西真的逃脱了我。
我正在阅读关于JavaScript的文章,这显然支持按位操作。 我不断地看到这个地方提到的这个操作,我试着弄清楚究竟是什么东西,但是我似乎根本就不明白。 那么他们是什么? 明确的例子将是伟大的! :d
还有几个问题 – 按位操作的实际应用是什么? 你什么时候可以使用它们?
由于没有人提出这些为什么有用的问题:
使用标志时,我使用了很多按位操作。 例如,如果要将一系列标志传递给操作(例如,File.Open,同时启用了读取模式和写入模式),则可以将它们作为单个值传递。 这是通过将每个可能的标志分配给bitset(byte,short,int或long)来完成的。 例如:
Read: 00000001 Write: 00000010
所以如果你想通过读写,你会传递(READ | WRITE),然后将两者合并
00000011
然后可以在另一端解密,如:
if ((flag & Read) != 0) { //...
哪个检查
00000011 & 00000001
哪个返回
00000001
这不是0,所以该标志确定了READ。
您可以使用XOR切换各种位。 我用这个标志来指定方向input(上,下,左,右)。 例如,如果一个精灵正在水平移动,我希望它转过来:
Up: 00000001 Down: 00000010 Left: 00000100 Right: 00001000 Current: 00000100
在这种情况下,我简单地用当前值(LEFT | RIGHT)XOR当前值,这将closuresLEFT和RIGHT。
位移在几种情况下是有用的。
x << y
是相同的
x * 2 y
如果您需要快速乘以2的乘方,但要注意将1位移入最高位 – 这会使得数字为负数,除非是无符号的。 处理不同大小的数据时也很有用。 例如,从四个字节读取一个整数:
int val = (A << 24) | (B << 16) | (C << 8) | D;
假设A是最重要的字节,D是最小的。 这将最终成为:
A = 01000000 B = 00000101 C = 00101011 D = 11100011 val = 01000000 00000101 00101011 11100011
颜色通常以这种方式存储(最重要的字节被忽略或用作Alpha):
A = 255 = 11111111 R = 21 = 00010101 G = 255 = 11111111 B = 0 = 00000000 Color = 11111111 00010101 11111111 00000000
要再次查找这些值,只要将这些位向右移动,直到它位于底部,然后屏蔽剩下的较高位:
Int Alpha = Color >> 24 Int Red = Color >> 16 & 0xFF Int Green = Color >> 8 & 0xFF Int Blue = Color & 0xFF
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)
值得注意的是,被列为其他答案的单比特真值表一次只能处理一个或两个input比特。 当你使用整数时会发生什么,比如:
int x = 5 & 6;
答案在于每个input的二进制扩展:
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
每列中的每一位都通过“AND”function运行,在底线上给出相应的输出位。 所以对上述expression式的答案是4.CPU已经完成了(在这个例子中)8个单独的“AND”操作并行,每个列一个。
我提到这个,因为我还记得有这个“AHA!” 当我了解这个多年前的那一刻。
按位运算符是一次只能工作一点的运算符。
AND只有在两个input都是1的情况下才是1。
如果一个或多个input为1,则OR为1。
仅当其中一个input为1时,异或为1。
只有当其input为0时,NOT才是1。
这些可以被最好地描述为真值表。 input可能性位于左上方,结果位是两个input交叉处显示的四个值之一(在NOT情况下为两个,因为它只有一个input)。
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
一个例子是,如果你只想要一个整数的低4位,你与15(二进制1111)如此:
203: 1100 1011 AND 15: 0000 1111 ------------------ IS 11: 0000 1011
这些是按位运算符,全部在JavaScript中支持:
-
op1 & op2
–AND
运算符比较两个比特,如果两个比特都是1,则结果为1; 否则,它返回0。 -
op1 | op2
op1 | op2
–OR
运算符比较两个位,如果位互补,则产生1的结果; 否则,它返回0。 -
op1^ op2
–EXCLUSIVE-OR
运算符比较两个比特,如果其中一个比特是1,则返回1,如果两个比特都是0或1,则返回0。 -
OMPLEMENT
– COMPLEMENT
运算符用于反转操作数的所有位。 -
op1 << op2
–SHIFT LEFT
操作符SHIFT LEFT
移动位,丢弃最左侧的位,并将最右侧的位赋值为0.向左移动实际上将op1乘以2。 -
op1 >> op2
–The SHIFT RIGHT
运算符向右移动位,丢弃最右边的位,并将最左边的位赋值0.每次向右移动都会将op1有效地分成两半。 最左边的符号位被保留。 -
op1 >>> op2
–The SHIFT RIGHT
–ZERO FILL
运算符向右移动位,丢弃最右边的位,并将最左边的位赋值0.每次向右移动都会将op1有效地分成两半。 最左边的符号位被丢弃。
要把它分解得更多一点,它与这个值的二进制表示有很大关系。
例如(十进制): x = 8 y = 1 会出来(二进制): x = 1000 y = 0001 从那里,你可以做计算操作,如“和”或“或”。 在这种情况下: x | y = 1000 0001 | ------ 1001 或...十进制
希望这可以帮助。
当提到“按位”这个术语时,有时会说明它不是一个“逻辑”运算符。
例如在JavaScript中, 按位运算符将它们的操作数视为32位(零和1)的序列 ; 同时, 逻辑运算符通常与布尔(逻辑)值一起使用,但可以与非布尔types一起使用。
以expr1 && expr2为例。
如果可以将其转换为false,则返回expr1; 否则,返回expr2。 因此,当与布尔值一起使用时,如果两个操作数都为真,则&&返回真; 否则,返回false。
a = "Cat" && "Dog" // t && t returns Dog a = 2 && 4 // t && t returns 4
正如其他人所指出的,2&4是一个按位与,所以它将返回0。
您可以将以下内容复制到test.html或其他东西,然后testing:
<html> <body> <script> alert("\"Cat\" && \"Dog\" = " + ("Cat" && "Dog") + "\n" + "2 && 4 = " + (2 && 4) + "\n" + "2 & 4 = " + (2 & 4)); </script>
在数字计算机编程中,按位操作在其各个位的级别上对一个或多个位模式或二进制数字进行操作。 这是一个由处理器直接支持的快速原始操作,用于操纵比较和计算的值。 算子的研究
-
按位与
-
按位或
-
按位不是
-
按位XOR
-
等等
列表项目
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
例如。
203: 1100 1011 AND 15: 0000 1111 ------------------ = 11: 0000 1011
按位运算符的用法
- 左移和右移运算符分别等于乘以除以x * 2 y 。
例如。
int main() { int x = 19; printf ("x << 1 = %d\n" , x <<1); printf ("x >> 1 = %d\n", x >>1); return 0; } // Output: 38 9
- &运算符可以用来快速检查一个数字是奇数还是偶数
例如。
int main() { int x = 19; (x & 1)? printf("Odd"): printf("Even"); return 0; } // Output: Odd
- 快速find最低的X和Y,
if else
没有if else
声明
例如。
int min(int x, int y) { return y ^ ((x ^ y) & - (x < y)) }
- 十进制转换为二进制
例如。
#include <stdio.h> int main () { int n , c , k ; printf("Enter an integer in decimal number system\n " ) ; scanf( "%d" , & n ); printf("%d in binary number system is: \n " , n ) ; for ( c = 31; c >= 0 ; c -- ) { k = n >> c ; if ( k & 1 ) printf("1" ) ; else printf("0" ) ; } printf(" \n " ); return 0 ; }
- 异或门encryption是stream行的技术,因为它的兼容性和程序员的继续使用。
- 按位异或操作符是技术面试angular度最有用的操作符。
bitwuse转移只能用+ ve号码
还有广泛的使用按位逻辑
这样想起来可能会有帮助。 AND(&)如何工作:
它基本上是说这两个数字的,所以如果你有两个数字5和3,他们将被转换成二进制,电脑会认为
5: 00000101 3: 00000011
都是一个:00000001 0是假的,1是真的
所以5和3的AND就是一个。 OR(|)运算符做同样的事情,除了只有一个数字必须是一个输出1,而不是两个。
我一直听说JavaScript的按位运算符有多慢。 我为我最新的博客文章做了一些testing,发现他们比几种testing中的算术select速度快了40%到80%。 也许他们过去很慢。 在现代浏览器中,我喜欢它们。
我的代码中有一个案例会因为这个而更快更容易阅读。 我会保持我的眼睛更多。