【问题标题】:What is the real powerful use of shift operators in C ? [closed]C 中移位运算符的真正强大用途是什么? [关闭]
【发布时间】:2016-07-22 08:37:50
【问题描述】:

左移运算符的一个目的是将左操作数乘以 2,然后右移进行整数除法。两者都有未定义行为Link 等约束。我不明白真正的用途是什么。我什至没有信心将它们用于除法或乘法。

【问题讨论】:

  • shift operators 的唯一真正用途是移位。根据问题/要求,他们找到了自己的用途。因此,了解他们的工作可以帮助或在实施过程中很方便。
  • 也许你真正想问的问题是什么是移位操作有用
  • 移位运算符在 C++ 中具有过载潜力。由于该帖子似乎专注于基本的“转变”,因此帖子将受益于仅 C 标签。 C++(和他们的用户)鼓励更多的抽象(在 / * 中使用>> << 是不好的),而 C 通常更接近金属(在 / * 中使用>> << 有时是好的)。明智地选择标签。

标签: c++ c


【解决方案1】:

只有初学者才会使用移位来进行除法或乘法运算(包括编写软件数十年但仍是初学者的人)。

移位操作用于移位。当你想移动位时,你会使用它们。如果你不知道移位是什么意思,你就不想使用它们。

【讨论】:

  • 今天只有初学者会使用移位来进行乘法运算”。在过去,编译器在优化方面几乎没有那么好,进行此类微优化可能会对性能产生非常显着的影响。
  • @MartinBonner 是的。那么今天除以8和左移3次有什么区别吗?
  • “如果你不知道移位是什么意思,你就不想使用它们”。否则就很少见了。不应理解为“不知道算了”。
  • @GulluButt 作为初学者并不丢人,这真的是一种侮辱吗?对我来说似乎是一种观察。如果您对赞成票感到惊讶,那么您为什么认为它们是由有经验的人制作的?你看不到谁投了赞成票,对吗?使用移位进行乘法和除法的问题在于它的表现力较差。如果你想 multiply,使用 multiplication 操作符,你的意图就很清楚了。如果您使用移位,那么阅读您的代码的其他人会认为您的意图是移动位。另一个问题是签名类型时潜在的 UB。
  • @A.Sarid:如果您对负值进行操作,则未定义左移,除以 8 已定义。如果您对正(或无符号)值进行操作,则行为没有区别,但您对后续读者的暗示有所不同。
【解决方案2】:

它们是按位运算符,因此它们用于按位运算。这是一个简单的示例,显示了一些需要移位的按位运算。

struct color {
    unsigned char r;
    unsigned char g;
    unsigned char b;
};

void setColor(struct color*,int);
int getColor(struct color*);

int main() {
    struct color myColor;
    int color;
    setColor(&myColor,0x00ff00);
    color = getColor(&myColor);
    return 0;
}

void setColor(struct color* color,int rgb) {
    color->r = (rgb>>16)&0xff;
    color->g = (rgb>>8)&0xff;
    color->b = rgb&0xff;
}

int getColor(struct color* color) {
    return color->r<<16|color->g<<8|color->b;
}

【讨论】:

  • rgb 为负数时,右移int 会导致实现定义的行为。如果代码使用unsigned rgb更好。
  • 如果 rgb 为负数,则无关紧要,因为位掩码 0xff 会清除除前 8 位之外的所有位。
【解决方案3】:

一个真实的用例是操作位掩码。例如,如果我有一个位掩码 x 并且我想设置从右边数第 7 位(我从零开始计数),我可以执行以下操作。

x = x | (1 << 7);

【讨论】:

  • n 可能影响1 的符号位时,使用unsigned 具有优势。建议(1u &lt;&lt; n)
猜你喜欢
  • 1970-01-01
  • 2012-05-22
  • 1970-01-01
  • 2010-10-15
  • 2018-03-09
  • 1970-01-01
  • 2010-10-30
  • 2011-07-23
  • 1970-01-01
相关资源
最近更新 更多