考虑以下代码:
x = 1 # 0001
x << 2 # Shift left 2 bits: 0100
# Result: 4
x | 2 # Bitwise OR: 0011
# Result: 3
x & 1 # Bitwise AND: 0001
# Result: 1
我可以理解Python(和其他语言)中的算术运算符,但我从来没有很好地理解过“按位”运算符。在上面的示例中(来自Python书籍),我理解左移位,但不理解其他两个。
此外,位运算符实际用于什么?我想举一些例子。
位运算符的实际用途是什么?我想举一些例子。
例如,这里有一个Python函数,它接受像#FF09BE
这样的字符串,并返回其红色、绿色和蓝色值的元组。
def hexToRgb(value):
# Convert string to hexadecimal number (base 16)
num = (int(value.lstrip("#"), 16))
# Shift 16 bits to the right, and then binary AND to obtain 8 bits representing red
r = ((num >> 16) & 0xFF)
# Shift 8 bits to the right, and then binary AND to obtain 8 bits representing green
g = ((num >> 8) & 0xFF)
# Simply binary AND to obtain 8 bits representing blue
b = (num & 0xFF)
return (r, g, b)
我知道有更有效的方法来实现这一点,但我相信这是一个非常简洁的例子,说明了移位和按位布尔运算。
一种典型用法:
|
用于将某个位设置为1
>
设置位(其中n为位号,0为最低有效位):
无符号字符a |=(1)
清楚一点:
无符号字符b
稍微切换一下:
无符号字符c^=(1)
测试一点:
无符号字符e=d
以你的列表为例:
x | 2
用于将x
的位1设置为1
x
按位运算符是处理多位值的运算符,但在概念上是一次一位。
AND
只有当两个输入都为1时才为1,否则为0。OR
如果一个或两个输入都是1,则为1,否则为0。XOR
只有当其中一个输入为1时才为1,否则为0。仅当输入为0时才为1,否则为0。
这些通常可以最好地显示为真值表。输入可能性在顶部和左侧,结果位是输入交叉点处显示的四个值之一(非的情况下为两个,因为它只有一个输入)。
AND | 0 1 OR | 0 1 XOR | 0 1 NOT | 0 1
----+----- ---+---- ----+---- ----+----
0 | 0 0 0 | 0 1 0 | 0 1 | 1 0
1 | 0 1 1 | 1 1 1 | 1 0
一个例子是,如果您只需要整数的低位4位,则可以使用15(二进制1111)将其与之相加,因此:
201: 1100 1001
AND 15: 0000 1111
------------------
IS 9 0000 1001
在这种情况下,15中的零位有效地起到过滤器的作用,迫使结果中的位也为零。
另外,
所以,例如:
1001 0101 >> 2 gives 0010 0101
1111 1111 << 4 gives 1111 0000
请注意,Python中的左移是不寻常的,因为它没有在丢弃位时使用固定宽度——虽然许多语言基于数据类型使用固定宽度,但Python只是扩展宽度以适应额外的位。为了在Python中获得丢弃行为,您可以使用按位
和
进行左移位,例如在8位值中左移位四位:
bits8 = (bits8 << 4) & 255
考虑到这一点,按位运算符的另一个例子是,如果你有两个4位值,你想打包成一个8位值,你可以使用所有三个运算符(
左移位
、和
和或者
):
packed_val = ((val1 & 15) << 4) | (val2 & 15)
如果
val1
为7,而val2
为4:
val1 val2
==== ====
& 15 (and) xxxx-0111 xxxx-0100 & 15
<< 4 (left) 0111-0000 |
| |
+-------+-------+
|
| (or) 0111-0100
问题内容: 我可以使用单个与号代替类似的按位运算符吗?可能会出现什么样的差异,是否有特定的示例可以清楚地说明此问题? 问题答案: 单身人士将始终检查这两个条件。如果双精度值判断为false,则它将在第一个条件之后停止。如果确实只需要1个2的条件为真或假,则使用2是“短路”状态检查的一种方法。 例如: 如果为,则第一个条件将失败,并且不会费心检查它的值。这是避免空指针的一种方法。 与和两个操作数始终
问题内容: 为什么按位操作打印-1?在二进制中,不为0应该为1。为什么呢? 问题答案: 你实际上很亲密。 在二进制中,不为0应该为1 是的,当我们谈论一点时,这是绝对正确的。 但是,其值为0实际上是全零的32位!将所有32个零转换为32个零。 这是的补码表示形式。 类似地: 也就是说,对于32位无符号二进制补码表示,。 进一步阅读: 补码 这是Java(以及其他系统)用来表示带符号的数字位的系统
问题内容: 我经常在代码中使用,如果是奇数,则返回true,如果是偶数,则返回false。 但是“&”实际上是做什么的? 问题答案: &是二进制的。如果您有一个二进制值,而您又有另一个二进制值,那么结果将是两者的按位运算。一个例子: 最右边的位是1(在这种情况下,数字是奇数)或0,在这种情况下,数字是偶数。如果您使用1表示数字,则仅查看最低有效位,而if检查该数字是1还是0。如其他人所述,请查看按
问题内容: 我正在研究《 Beginning Android Games》 这本书。我注意到的一件事是: 这是我第一次看到这样的变量,所以我不知道它的作用。我在Java中运行代码并创建了一些示例。 如果我运行此代码: 答案将是0?这是为什么? 如果我运行此代码: 起初,我认为这是价值的串联,因此我假设i = 10500,但事实并非如此。答案是一样的。还是0?有人知道这里发生了什么吗? 问题答案:
本文向大家介绍JavaScript 按位NOT运算符(〜),包括了JavaScript 按位NOT运算符(〜)的使用技巧和注意事项,需要的朋友参考一下 示例 按位NOT(~)对值中的每个位执行NOT操作。 语法: 返回值: 一个Number。 描述 NOT操作的真值表为: 一种 不是 0 1 1 0 按位不加数字会导致:-(x + 1)。 例子: 值(以10为底) 值(以2为底) 返回(以2为底)
有符号和无符号变量在按位运算上有区别吗?< br >例如,在处理无符号数字时:< br> 将得到00000101。 但当处理带符号的数字时会发生什么?