【问题标题】:What is the best way to explain bit manipulation to the students?向学生解释位操作的最佳方式是什么?
【发布时间】:2010-11-18 20:40:58
【问题描述】:

我目前正计划举办针对微控制器应用的优化 C 代码培训研讨会。

目前我被困在如何解释 C 中的位操作?

正是我不想要的是引导学生学习位结构,而是引导他们有效地使用位操作......

有什么建议吗?

【问题讨论】:

  • “正是我不希望引导学生理解位结构”我不明白 - 如果你不了解结构,你怎么可能理解位操作?
  • @annakata - 我可能是错的,但我认为他的意思是他不想从结构声明中的“位域”开始。在我看来,他最好从不谈论它们。
  • 同意,结构中的位域非常糟糕,不应该被使用,更不用说讨论了
  • 这正是他需要谈论位域的原因。并提供非常简单的解释,说明为什么它们非常糟糕。否则,他们会在书中读到它们,并想出很棒的、简单的方法来进行位操作。
  • @dwelch:为什么结构中的位域非常糟糕?或者你真的是指在字节数组上映射结构(通过指针转换或联合)来解析字节数据,这有很多原因?

标签: assembly embedded bit-manipulation


【解决方案1】:

不要从 C 语句和语法开始。从基本的布尔代数开始,然后让他们手动进行一堆二进制算术。一旦他们真正理解了 AND、XOR、NAND 等背后的数学原理,任何语言的编程语法都会立即被理解。更重要的是,他们将完全熟悉 de Morgan 定律等有用的变换,以及位代数的其他属性,如可用于将长操作折叠成更短操作的传递性。

【讨论】:

    【解决方案2】:

    我认为您应该关注通过位操作解决了哪些实际任务,以便他们了解为什么。位操作本身非常简单,但如果一个人不明白为什么他们首先会接触到它,可能会让人不知所措。

    【讨论】:

      【解决方案3】:
      1. AND、OR 和 XOR 的真值表
      2. 十进制和十六进制数字的二进制表示
      3. 对二进制数应用 AND、OR 和 XOR。
      4. 设置一个位而不修改其他位
      5. 清除一个位而不修改其他位
      6. 切换一个位而不修改其他位

      【讨论】:

        【解决方案4】:

        从基础做起。

        基本布尔代数

        使用真值表练习布尔代数。写出所有输入的列并分解计算步骤。

        Binary Logical Connectives

        不是

        A | Not A
        --+-------
        0 |   1
        1 |   0
        

        A | B | A And B
        --+---+--------
        0 | 0 |    0 
        0 | 1 |    0
        1 | 0 |    0
        1 | 1 |    1
        

        或者

        A | B | A Or B
        --+---+-------
        0 | 0 |    0 
        0 | 1 |    1
        1 | 0 |    1
        1 | 1 |    1    
        

        异或

        A | B | A Xor B
        --+---+--------
        0 | 0 |    0 
        0 | 1 |    1
        1 | 0 |    1
        1 | 1 |    0
        

        练习:

        (A And B) Or (B And C)
        
        A | B | C | A And B | B And C | (A And B) Or (B And C)
        --+---+---+---------+---------+-----------------------
        0 | 0 | 0 |    0    |    0    |           0    
        0 | 0 | 1 |    0    |    0    |           0    
        0 | 1 | 0 |    0    |    0    |           0    
        0 | 1 | 1 |    0    |    1    |           1    
        1 | 0 | 0 |    0    |    0    |           0    
        1 | 0 | 1 |    0    |    0    |           0    
        1 | 1 | 0 |    1    |    0    |           1        
        1 | 1 | 1 |    1    |    1    |           1     
        

        二进制表示

        十六进制表示

        Hex | Binary
        ----+-------
        0   |  0000
        1   |  0001
        2   |  0010
        3   |  0011
        4   |  0100
        5   |  0101
        6   |  0110
        7   |  0111
        8   |  1000
        9   |  1001
        A   |  1010
        B   |  1011
        C   |  1100
        D   |  1101
        E   |  1110
        F   |  1111
        
        So,
        1A6 = 0001 1010 0110
        

        逻辑语句缩减

        Properties of Boolean Algebra

        De Morgan's Laws

        Not (A Or B) = (Not A) And (Not B)
        Not (A And B) = (Not A) Or (Not B)
        

        位操作使用示例和代码

        Sean Eron Anderson 有一篇关于 Bit Manipulation Uses 的许多用途的非常好的文章,名为 Bit Twiddling Hacks

        【讨论】:

          【解决方案5】:

          通过给他们不同的逻辑门和规律的例子来指导他们,你也可以给出几个设计逻辑电路的例子。

          【讨论】:

            【解决方案6】:

            也许从一个实施效率低但有用的解决方案开始。

            然后展示如何进行有效的实施。

            【讨论】:

              猜你喜欢
              • 2012-12-22
              • 1970-01-01
              • 1970-01-01
              • 2010-09-07
              • 1970-01-01
              • 1970-01-01
              • 2010-11-04
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多