【问题标题】:Bitwise Operation confusion位运算混乱
【发布时间】:2012-10-01 22:04:19
【问题描述】:

首先,让我郑重声明,这是为我周三的期中考试做准备。 我正在学习 C 编程课程,我们几乎没有接触过按位运算,但我们正在接受测试。

例如,我们应该知道 A、B、C 和 D 的初始化内容,如下所示:

unsigned int A, B, C, D;
A = 0xfedc & 0x300c;
B = 0xba98 | 0x1236;
C = 0x7654 ^ 0xfa00;
D = ~0xffff3210;

如果可能,您能否为我提供一个体面的教程/指南来理解这些概念?一个解释也会很棒,但我不希望得到一个实际的答案解释。

提前感谢您提供的任何帮助。

【问题讨论】:

  • 那些不是逻辑运算符,而是位运算符。
  • 有趣的是,我的老师称它们为逻辑运算,因此我使用它。不过,我认为它们确实是按位计算的。我很抱歉。
  • 无需道歉。特别是如果你的老师这样称呼他们。并且可以将它们视为同时对相应位对应用逻辑运算 [~ 当然不是对],所以这不是完全错误,只是不寻常 - 除了处理器中执行这些操作的部分被称为算术Logic 单元,所以它不是 so 不寻常的。但称它们为按位运算符以将它们与 &&|| 区分开来具有 - 我相信很明显 - 优势。

标签: c hex logic operations


【解决方案1】:

第一个问题是:

  • 您是否将& 识别为按位与、| 为按位或、^ 为按位异或、~ 为按位非?

如果没有,你有一两个问题,需要把它们全部识别出来。

那你需要知道每个操作是什么意思……

  • 对于给定的位位置,如果两个位都是1,那么b1 & b2 将是1;否则,它将是0
  • 对于给定的位位置,如果两个位都是0,那么b1 | b2 将是0;否则,它将是1
  • 对于给定的位位置,如果两个位相同(都0 或都1),那么b1 ^ b2 将是0;否则将是1
  • 对于给定的位位置,如果位是0,则~b1 将是1;否则,它将是0

您还需要认识到十六进制表示与数字中的位模式密切相关。

  • 0x0 ⟶ 00002
  • 0x1 ⟶ 00012
  • ...
  • 0xE ⟶ 11102
  • 0xF ⟶ 11112

结合这些,您可以推断出问题的答案,将按位运算符应用于操作数的每一位。

【讨论】:

  • 我现在正在上课,所以无法写出完整的回复。但是,我绝对理解您到达那里的第一行。主要的是我需要弄清楚位和十六进制背后的模式。我现在两个都不记得了。
  • 虽然我认为我已经掌握了覆盖逻辑,但你能解释一下在吃二进制数后使用下标是什么意思吗?
  • 下标2简单地表示二进制数是二进制数;我可以在 LHS 上使用 16 作为下标,但 0x 前缀也很明确。在 C 中没有表示二进制数的标准方法。你偶尔会看到 0b1111 或类似的东西;这是明确但非标准的,所以我没有使用它。
  • FWIW:A = 0x300CB = 0xBABEC = 0x8C54D = 0x0000CDEF,毫无疑问,您可以通过编写一个简单的程序来进行打印来证明自己。你的功课是确保你知道为什么这些答案是正确的。
  • 是的,我很幸运找到了那部分。不幸的是,我的老师在考试期间让我们手写代码——没有电脑。所以这真的是全靠手/脑。如果我有一台电脑,我可以反复试验并更容易弄清楚。再次感谢。
【解决方案2】:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-12
    • 1970-01-01
    相关资源
    最近更新 更多