当前位置: 首页 > 知识库问答 >
问题:

按位运算和用法

潘璞瑜
2023-03-14

考虑以下代码:

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书籍),我理解左移位,但不理解其他两个。

此外,位运算符实际用于什么?我想举一些例子。

共有3个答案

余信然
2023-03-14

位运算符的实际用途是什么?我想举一些例子。

例如,这里有一个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)

我知道有更有效的方法来实现这一点,但我相信这是一个非常简洁的例子,说明了移位和按位布尔运算。

侯令雪
2023-03-14

一种典型用法:

|用于将某个位设置为1

>

  • 设置位(其中n为位号,0为最低有效位):

    无符号字符a |=(1)

    清楚一点:

    无符号字符b

    稍微切换一下:

    无符号字符c^=(1)

    测试一点:

    无符号字符e=d

    以你的列表为例:

    x | 2用于将x的位1设置为1

    x

  • 濮阳祯
    2023-03-14

    按位运算符是处理多位值的运算符,但在概念上是一次一位。

    • 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。 但当处理带符号的数字时会发生什么?