【问题标题】:How to unset a specific bit in an integer如何取消设置整数中的特定位
【发布时间】:2023-03-23 15:41:01
【问题描述】:

说,我有一个像10101 这样的整数,我想取消设置第三位以获得10001;如果我有10001,我仍然会得到10001;我怎样才能实现它?

unset(int i, int j)
int i= 10101 or 10000
int j = 00100

【问题讨论】:

  • 你能对语言下定决心吗?
  • 请告诉我们您实际使用的是哪种编程语言。 (您问题中的“代码”在您标记问题的任何问题中均无效。)

标签: c# java c++ c


【解决方案1】:

假设您正在从右侧索引位,这应该可以取消设置 value 中的特定位:

int mask = 1 << bitIndex;
value &= ~mask;

您可以使用类似的代码设置位:

value |= mask;

mask 和以前一样。 (这假设位索引从 0 开始。)

【讨论】:

    【解决方案2】:

    清除或取消设置

    使用按位与运算符 (&) 清除位。

     number &= ~(1 << x); 
    

    这将清除位 x。您必须使用按位非运算符 (~) 反转位字符串,然后将其与。

    注意:这里 x 是从 0 到 LSB 的位位置。

    【讨论】:

      【解决方案3】:

      您可以切换第 n 位

      结果 = 数字 ^ (1

      【讨论】:

      • 切换未清除。如果该位已经为 0,OP 希望该位保持为 0。
      【解决方案4】:

      如果您正在处理文字,那么您可以只使用十六进制数字。将您的位模式转换为十六进制数字:

      10101 => 0x15
      00100 => 0x04
      

      因此,以下 C 代码会将 b 设置为您想要的结果。

      int a = 0x15;
      int b = a & ~( 0x04 );
      

      如果你想要一些通用的东西,你可以有一个 C 函数(删除所有范围检查),比如

      int clearBit( int value, int bit )
      {
          // Assume we count bits starting at 1
          return value & ~( 1 << (bit -1) );
      }
      

      【讨论】:

        【解决方案5】:

        在 C 和 C++ 中,使用 bit wise AND operator 形成 AND 掩码:

        10101 & 10001
        

        【讨论】:

        • 这对于取消设置任意位没有帮助,因为您必须提前创建掩码。
        • @QuinnTaylor:OP 知道他想要取消设置的位并在 Q 中明确表示,鉴于我担心评论和反对票只是迂腐的噪音。跨度>
        • 这个“解决方案”的问题是 OP 已经必须形成掩码 10001,而这正是 OP 试图计算的。 (我读到 OP 的问题是询问一般情况,当一个人不知道 i 的实际值但又想将某个特定位归零时。)
        【解决方案6】:

        Bitwise functions.

        在 Java 中:

        int num = 0b10101;
        int mask = 1 << bitPosition;
        
        System.out.println(Integer.toBinaryString(num));
        num &= ~mask;
        System.out.println(Integer.toBinaryString(num));
        

        【讨论】:

        • 不正确。您的代码仅适用于N=3Nth 位由(1 &lt;&lt; N) 给出,用于N = 0..。与integerLength无关。
        • @EJP 啊,我打字的时候已经晚了,已修复。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-05-02
        • 1970-01-01
        • 2016-11-30
        • 1970-01-01
        • 1970-01-01
        • 2013-11-06
        • 1970-01-01
        相关资源
        最近更新 更多