language-agnostic - 如何使用按位运算设置或清除前 3 位?

标签 language-agnostic bit-manipulation

假设我有一个类似 0x448 的号码.在二进制中,这是 0100 0100 1000 .

如何使用按位运算将位 1、2 和 3 设置为全 0 或全 1?当我说前三个时,我将最右边的位算作零位。

所以,例如

位为 1:

b12            b0 
  0100 0100 1110
            ^^^

位为 0:
b12            b0
  0100 0100 0000
            ^^^

我猜想将它们设置为 1 我使用位或掩码为 14 (0x000e)?但如果是这种情况,我该如何做类似的事情来清除这些位?

有关的:
  • How do you set, clear and toggle a single bit in C? (语法不同,但操作相同)
  • 最佳答案

    您的位设置正确:OR使用您要设置的位的掩码。

    位清除位非常相似:AND与您要清除的位的补码。

    示例:0x0448 的词.

    设置位 1、2 和 3 将为 Word OR 0x000e :

        0000 0100 0100 1000 = 0x0448
     OR 0000 0000 0000 1110 = 0x000e
        ---- ---- ---- ----
      = 0000 0100 0100 1110 = 0x044e
    

    清除位 1、2 和 3 将是 Word AND 0xfff1 :
        0000 0100 0100 1000 = 0x0448
    AND 1111 1111 1111 0001 = 0xfff1
        ---- ---- ---- ----
      = 0000 0100 0100 0000 = 0x0440
    

    详细说明补码,用于清除的 AND 模式是用于设置的 OR 模式的逻辑非(每个位颠倒):
     OR 0000 0000 0000 1110 = 0x000e
    AND 1111 1111 1111 0001 = 0xfff1
    

    这样您就可以使用您最喜欢的语言 NOT 操作,而不必计算出两个值。

    关于language-agnostic - 如何使用按位运算设置或清除前 3 位?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/750240/

    相关文章:

    algorithm - 想要以不同的方式实现归并排序算法

    algorithm - 用相等的 XOR 划分数组

    c - 按位运算相当于大于运算符

    actionscript - 对 RGB 值使用逻辑位移

    c++ - 按位运算符从 32 位获取字节

    performance - 静态类会导致多核系统出现性能问题吗?

    command-line-interface - 如何从 Semgrep 保存或导出报告/发现/结果?

    testing - TDD 单元测试子方法

    unit-testing - 如何使用 GNU 自动工具为 "make check"创建测试

    c++ - N 位环绕的整数减法