【问题标题】:C++: what does (a<<b) mean?C++:(a<<b) 是什么意思?
【发布时间】:2012-06-14 12:48:26
【问题描述】:

我有一个包含以下定义的 C++ 头文件:

#define CACHE_NUM_WAYS    (1<<1)
#define CACHE_DATA_SIZE   (1<<8)

在其余代码中用作整数。

这是什么意思?它的价值是什么?

【问题讨论】:

标签: c++ operators


【解决方案1】:

【讨论】:

  • 这就是为什么 CACHE_NUM_WAYS 有 2 个,CACHE_DATA_SIZE 有 256 个。
  • #define CACHE_DATA_SIZE (1&lt;&lt;8)#define CACHE_DATA_SIZE 256有什么区别。
  • @AshBurlaczenko 没有区别。这只是一种不同的编写方式。 1&lt;&lt;8 向您强调,这是在第 8 个位置的单个 1,其余的是 0(等于 256),而 256 告诉您十进制值并且不直接告诉您任何关于设置或清除位。
  • @AshBurlaczenko 它们是相同的值,我使用 (1
【解决方案2】:

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

所以当你写1&lt;&lt;17时,1的二进制表示左移17位为:

//before (assume 1 is represented by 32-bit)
1 << 17  
0000 0000 0000 0000 0000 0000 0000 0001 << 17 (before - binary representation)

//after
0000 0000 0000 0010 0000 0000 0000 0000       (after - binary representation)

【讨论】:

    【解决方案3】:

    &lt;&lt; 是按位左移(还有&gt;&gt; 是按位右移) 如果你有 32 位整数

    1      = 00000000 00000000 00000000 00000001 = 1
    1 << 1 = 00000000 00000000 00000000 00000010 = 2
    1 << 8 = 00000000 00000000 00000001 00000000 = 256
    

    【讨论】:

      【解决方案4】:

      1

      00000000 00000001 changes to 00000000 00000010
      

      1

      00000000 00000001 changes to 00000001 00000000
      

      这是一个位移操作。对于右侧的每个 1,您可以将自己视为将左侧的值乘以 2。因此,2

      此外,您可以将 4 >> 1 = 2(和 5 >> 1 = 2,因为您向下舍入)作为逆运算。

      【讨论】:

      • 实际上,效率点并不正确,因为编译器足够聪明,可以将1&lt;&lt;1 转换为1*2,如果它认为后者有效,则只需将2
      • @Nawaz:在大多数情况下,存在i&lt;&lt;22&lt;&lt;ii&lt;&lt;j 之类的变量,因此此处不考虑编译器优化。
      【解决方案5】:

      a&lt;&lt;b 对于整数表示“左移”。 a 的按位表示左移b 位。这与乘以(2 的b 的幂)相同。

      所以在你的例子中,(1&lt;&lt;1)1*(2^1)2(1&lt;&lt;8)1*(2^8)256

      值得指出的是,一般而言,与 c++ 中的其他运算符一样,&lt;&lt; 可能会被覆盖以执行其他功能。默认情况下,输入/输出流会覆盖此运算符,以便您编写简洁的代码以将一堆参数发送到流。所以你可能会看到这样的代码:

      cout << something << somethingelse
      

      并且&lt;&lt; 在这种情况下不是意味着左移。

      【讨论】:

      • 感谢这个例子
      【解决方案6】:

      1

      这就是我的理解。 以最通俗的方式,将其理解为二进制数系统中的 1(00000001)现在从之前的位置提升到前面的 8 位(位), 并且对于我们所知道的每个地方,它移动的值(二进制中的 2)都成指数倍增 所以它变成了 1*(2^8)=256。

      所以 1

      【讨论】:

      • 基本上它是一个按位移位运算符。将位移动指定的位置
      【解决方案7】:

      a 意思 (a * pow(2,b))-> a * 2^b //左筛运算符

      a>>b 表示 (a / pow(2,b))-> a / 2^b //右筛选运算符 >>

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-02
        • 2013-12-16
        • 2011-11-21
        • 1970-01-01
        • 2014-02-09
        • 2018-08-06
        • 1970-01-01
        • 2022-11-10
        相关资源
        最近更新 更多