【问题标题】:Bitwise Manipulation Functions [duplicate]位操作函数 [重复]
【发布时间】:2012-08-06 18:00:16
【问题描述】:

可能重复:
How do you set, clear and toggle a single bit in C?

我正在为即将到来的期末考试而学习,我想验证学习指南中的一些问题。

一些上下文:

  • Set() 函数将一个字节中的一位设置为 1

  • Unset() 函数将一个字节中的一个位设置为 0

  • Flip() 函数将位“翻转”到它的反面

所以我们班的某个孩子自己回答了学习指南问题,但我已经发现了一些错误,这些答案听起来很可疑。他是这样说的:

Set 使用了哪个操作?或运算符 |

Unset 使用哪个操作? Xor 运算符 ^ 完成两次

翻转使用哪种操作?异或运算符^

这些是在我上面描述的函数中实现的正确的按位运算符吗?

【问题讨论】:

  • 第二个是错的——第一个和第三个都可以。想一想 - 翻转(反转)两次并不会取消它。
  • ...正如这个问题所示,请在提问之前进行一些搜索。 Paul 指向的副本只是这个问题在网络上的一个可能资源。

标签: c++ c bit-manipulation bitwise-operators


【解决方案1】:

对于数字 x 中的第 n 位...

int Set(x, n){
   return x | (1 << n);
}

int Unset(x, n){
   return (x ^ (1 << n)) ^ (1 << n);
}

int Flip(x, n){
   return x ^ (1 << n);
}

【讨论】:

  • Unset 实现不正确 - 反转位两次不会清除它
  • 哦,快!你说得对!它应该是 x & ~(1
【解决方案2】:
    00000000 |
    00000001 =
--------------
    00000001   // Sets

    00000001 &
    00000000 =
--------------
    00000000   // Unsets

    00000001 ^
    00000001 =
--------------
    00000000   // Flips

如果bit是字节中要操作的位:

x |= (1 << bit);    // Sets
x &= ~(1 << bit);   // Unsets   00000001 becomes 11111110.
x ^= (1 << bit);    // Flips

【讨论】:

  • 你的第二个取消设置所有位
  • @Esailija:是的,我要改变这个
【解决方案3】:

第一个你是对的,但对于Unset(),你应该在那个位使用&amp;0

【讨论】:

  • 例如:未设置第 5 位 x &amp; ~(1&lt;&lt;5)
【解决方案4】:

设置用途或

未设置使用 And

翻转使用异或

这里已经回答了: How do you set, clear, and toggle a single bit?

【讨论】:

    猜你喜欢
    • 2014-12-22
    • 2018-12-26
    • 2014-07-31
    • 2020-07-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-07-06
    • 1970-01-01
    相关资源
    最近更新 更多