【问题标题】:Left shift loop formula左移循环公式
【发布时间】:2013-11-17 13:46:20
【问题描述】:

我在一个程序示例中找到了以下代码:

const unsigned int n = /* something */
unsigned int i = 1;
for (unsigned int j = 1; j < n-1; ++j) {
    i <<= 1;
}

是否有直接的公式可以在没有循环的情况下从 n 计算 i

【问题讨论】:

  • 不要打扰,真的,任何半体面的编译器都会优化循环。
  • @HansPassant 我不同意。为什么要用这样的循环来混淆代码?
  • @jrok - 为什么要修改不需要优化的工作代码?你真的认为 abhishek 的 sn-p 不是混淆器吗?你确定它准确吗?
  • @HansPassant 我在 Abhishek 编辑他的答案之前写了评论:)

标签: c++ c algorithm formula bit-shift


【解决方案1】:

更准确地说:

假设 unsigned int 为 16 位(C++ 标准规定的最小值)

i = ( n < 18 ) ? ( ( n >= 2 ) ? ( 1 << (n-2) ) : 1 ) : 0;

【讨论】:

  • +1 完全正确——按负值移位充其量是未定义的。 stackoverflow.com/questions/4945703/…
  • @AkiSuihkonen:好吧,但仍然不完整;如果 unsigned int 为 32 位,则 1 &lt;&lt; 40 也将未定义;所以你需要防止下溢和溢出。
  • 但是如果unsigned int 不是 32 位,那么你的幻数就是错误的。
  • @MikeSeymour 好吧,我希望现在它考虑到 C++ 标准的最小范围规范。但是,OP发布的原始代码也没有这个检查。
  • @AbhishekBansal:确实;最好省略该检查(在n 上记录前提条件),或使用从sizeof i 计算的值。现在,如果 unsigned int 不是 16 个字节,那么您的幻数就是错误的。
【解决方案2】:

你可以使用:

i = 1 << (n - 2);

或更严格:

#include <limits.h> /* for CHAR_BIT */

const unsigned int n = /* something */;
unsigned int i  = 1;

if( (n - 2) > 0 && (n - 2) < (sizeof(i) * CHAR_BIT) ) {
  i = 1 << (n - 2);
}

【讨论】:

    猜你喜欢
    • 2022-06-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2023-04-08
    • 2020-03-01
    相关资源
    最近更新 更多