【问题标题】:C code format using <<使用 << 的 C 代码格式
【发布时间】:2015-04-02 12:43:19
【问题描述】:

我不明白为什么以下sn-p代码中的“1

gpio_output_set((1<<5), 0, (1<<5), 0);

为什么不使用 5?还是 32? :)

感谢您的帮助

【问题讨论】:

  • 你知道1 &lt;&lt; 5的值吗?肯定不是5。写几行代码,检查一下它的值。
  • 它被称为“移位”运算符。具体来说,这是一个左移运算符,它所做的是将左参数 (1) 的位移动(移位)左多个位置 (100000 = 32)
  • 我知道 shift 但在这种情况下没有得到它,谢谢,很有帮助
  • 真正的问题是:'为什么不使用 0x20?'

标签: c syntax firmware


【解决方案1】:

“为什么不使用 32?”

因为没有人(包括一年后编写代码的人)知道gpio_output_set(32) 的含义。在这种情况下,32 就是所谓的“幻数”,它是程序员的俚语,指的是一个硬编码的数字,它就在你的代码中,没有合理的解释为什么,它只是神奇地完成了工作。这是非常糟糕的编程习惯。

另一方面,1&lt;&lt;5 是业界事实上的标准方式来表示“第 5 位”。程序员的意图很明确。

尽可能始终努力编写自记录代码。

【讨论】:

  • 谢谢!有趣的拍摄
  • 引脚定义为 BIT0 到 BITX,所以我希望 BIT5
【解决方案2】:

因为 1

【讨论】:

    【解决方案3】:

    表达式1&lt;&lt;5 的值等于32 并等价于2 ^ 5(在数学符号中)

    运算符&lt;&lt; 是按位左移运算符。

    来自 C 标准(6.5.7 位移位运算符)

    4 E1

    我认为这个记录

    gpio_output_set((1<<5), 0, (1<<5), 0);
    

    被用来代替

    gpio_output_set( 32, 0, 32, 0);
    

    显示值是如何获得的。但无论如何,使用像 5 这样的幻数是个坏主意。

    【讨论】:

    • 2 ^ 5 在这种情况下是一个不幸的选择。
    • 因为^ 在 C 中是二进制异或。试试2&lt;sup&gt;5&lt;/sup&gt;(直接在标记中,而不是在反引号之间)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-04-01
    • 1970-01-01
    • 2010-10-24
    • 2011-01-31
    • 2016-04-18
    • 2017-04-15
    • 2011-07-19
    相关资源
    最近更新 更多