【问题标题】:I dont understand this methode : z= z>>1我不明白这种方法:z= z>>1
【发布时间】:2013-12-11 03:20:49
【问题描述】:

这是我的代码:

int main(){
 unsigned int z = 18;
 z = z>>1;
 std::cout << z << std::endl;
}

我知道我的结果将是 9,但我不明白“z = z>>1”这一行 它有什么作用? >> 是什么意思?我以为它只用于 cin

【问题讨论】:

  • 提示:它是一个运算符,应该便于研究。
  • 嗯,我有时对人们对他们的亲密理由投入的想法很少感到绝望。由于给出的原因,我可能理解但“离题”?这个问题没有要求代码,我看不出提问者如何在没有实际答案的情况下表现出对问题的更多理解。有时,SO 似乎正在偏离“接受任何技能水平”的模式,虽然这无疑会清除一些垃圾,但它也可能会将婴儿和洗澡水一起扔掉。不过,我只是一个人:-)
  • operator>> 和 operator

标签: c++ int unsigned


【解决方案1】:

&gt;&gt; 是右位移(a),它将一个值中的所有位右移给定值。对于无符号整数,&gt;&gt; 1 实际上是一个整数除以二。

二进制18的值是:

0001 0010
   |   |
   |   +---  2
   +------- 16
            --
            18

将其右移一位(位“下降”右侧,0 位从左侧进入)给您:

0000 1001
     |  |
     |  +--  1
     +-----  8
            --
             9

(a) 这是在 this 的特殊情况下。 C++ 还允许将&gt;&gt; 用作类的运算符,例如std::cin &gt;&gt; myInputVar; 将尝试从标准输入中读取一个值并将其放入myInputVar 变量中。

【讨论】:

  • 仅在 >> 1 的情况下,对于一般情况 >> n 它实际上是整数除以 2^n...
  • 哦,好吧,如果我有 z = z>>2,我会将我的 unsigned int 除以 4? @Quirliom
  • @user2843560: 是的,但使用z = z / 4 会更易读 :-) 移位最好留给实际的位操作——如果你想除法,你应该除法。
  • @paxdiablo,使用z /= 4; imo 更是如此。
  • 感谢您的帮助,我现在明白了! @paxdiablo
【解决方案2】:

1 咬 z 向左移动。 例如,您的 z 是 18,即(如果 int 是 2 个字节)0000 0000 0001 0010 bynary,当您移动它时,z 变为 0000 0000 0000 1001 whitch 是 9。它实际上像二倍体一样工作。如果您有负值,例如 -18,则在第二个补码中是

0000 0000 0001 0010
1111 1111 1110 1101//first complement
1111 1111 1110 1110//second complement

当你移动它时,符号字节放在顶部

1111 1111 1111 0111
0000 0000 0000 1000//first complement
0000 0000 0000 1001//second complement

女巫是-9。

右移很容易,在网上搜索左移,如果有符号值则更复杂

【讨论】:

  • 左移一个负值可能是未定义的行为,是的,但右移并不是那么容易。右移负值具有实现定义的值。
猜你喜欢
  • 1970-01-01
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2020-04-16
  • 1970-01-01
  • 2012-07-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多