【问题标题】:Binary operation in CC中的二元运算
【发布时间】:2014-11-02 05:42:00
【问题描述】:

我有两个字符

char c1='A', c2 = 'B';

因为A的8位二进制是01000001B的二进制是01000010。我希望将B 的最左侧位放入A 的最右侧位中,以便c1 变为01000000。我通过计算二进制 A 和 B,然后获取新的二进制,然后执行描述的过程,然后将新的二进制分配给 c1 来做到这一点。 我的问题是是否有任何有效的方法可以做到这一点?

【问题讨论】:

  • 你能具体说明你在做什么吗?
  • 请注意'A''a' 不是一回事。除此之外,结合各种按位操作将有效地做到这一点。你试过什么?

标签: c binary char


【解决方案1】:

c2 最左边的位是:

c2 & 0x80

要将其移到最右边,请使用右移:

(c2 & 0x80) >> 7

要将其与c1 结合,您首先必须清除c1 的最右边位:

(c1 & 0xfe)

然后你将它们与|结合起来:

c1 = (c1 & 0xfe) | ((c2 & 0x80) >> 7);

您还应该将声明更改为unsigned char 以避免符号位出现问题。使用按位运算时,通常最好只使用 unsigned 变量。

【讨论】:

  • 由于 c2 是有符号字符,((c2 & 0x80) >> 7) 会扩展符号吗? ((c2 >> 7) & 0x1) 怎么样?
  • @JS1 我已将答案更改为建议使用无符号。
  • @JS1:请注意,虽然我认为在位操作中使用 unsigned 类型是个好主意,但这些表达式都不会受到符号扩展的影响,因为 & 操作将摆脱任何符号扩展位。即使在((c2 & 0x80) >> 7) 中,也不会在移位操作中扩展符号位,因为(c2 & 0x80) 的结果是没有设置任何符号位的int(不是charsigned char)。
  • @Michael Burr:好点,你是对的。我刚刚被符号扩展错误烧伤了很多次,现在我只是本能地不信任任何已签名的右移。
  • @MichaelBurr AndrewLui 的回答存在这个问题,因为他在换档前没有戴口罩。
【解决方案2】:

你想要这个:

c1 = (c1 & 0xfe) | (c2 >> 7);

【讨论】:

  • 你不需要右移来将最左边的位移动到最右边的位吗?
  • 哎呀,我错过了最右边到最左边的部分,已修复它。谢谢。
猜你喜欢
  • 2016-04-29
  • 1970-01-01
  • 1970-01-01
  • 2012-03-24
  • 1970-01-01
  • 2016-03-08
  • 1970-01-01
  • 2010-09-11
  • 1970-01-01
相关资源
最近更新 更多