C语言中的二进制运算
我有两个角色C语言中的二进制运算,c,binary,char,C,Binary,Char,我有两个角色 char c1='A', c2 = 'B'; 因为A的8位二进制是01000001,而B的二进制是01000010。我想把B的最左边的位放入A的最右边的位,这样c1变成01000000。我通过计算二进制文件A和B,然后获取新的二进制文件,然后执行描述的过程,然后将新的二进制文件分配给c1。 我的问题是是否有任何有效的方法可以做到这一点?您希望这样: c1 = (c1 & 0xfe) | (c2 >> 7); c2最左边的位是: c2 & 0x80
char c1='A', c2 = 'B';
因为A
的8位二进制是01000001
,而B
的二进制是01000010
。我想把B
的最左边的位放入A
的最右边的位,这样c1变成01000000
。我通过计算二进制文件A和B,然后获取新的二进制文件,然后执行描述的过程,然后将新的二进制文件分配给c1
。
我的问题是是否有任何有效的方法可以做到这一点?您希望这样:
c1 = (c1 & 0xfe) | (c2 >> 7);
c2
最左边的位是:
c2 & 0x80
要将其移到最右边的位,请使用右移:
(c2 & 0x80) >> 7
要将其与c1
相结合,首先必须清除c1
最右边的位:
(c1 & 0xfe)
然后将它们与|
组合:
c1 = (c1 & 0xfe) | ((c2 & 0x80) >> 7);
您还应该将声明更改为
unsigned char
,以避免符号位出现问题。使用位运算时,通常最好只使用无符号变量。您能准确地显示您正在执行的操作吗?请注意'A'
和'A'
不是一回事。除此之外,组合各种逐位操作将有效地实现这一点。你试过什么?你不需要右移把最左边的部分移到最右边的部分吗?哎呀,我错过了最右边到最左边的部分,修好了。谢谢。((c2&0x80)>>7)
会因为c2是有符号字符而得到符号扩展吗?((c2>>7)&0x1)
怎么样?@JS1我已经改变了我的答案,建议使用无符号。@JS1:注意,虽然我认为在位操作中使用无符号
类型是个好主意,但这些表达式都不会受到符号扩展的影响,因为&
操作将去掉任何符号扩展位。即使在((c2&0x80)>>7)
中,移位操作中也不会有要扩展的符号位,因为(c2&0x80)
的结果是一个int
(不是char
或signed char
)不会设置任何符号位。@Michael Burr。“我已经被符号扩展错误烧坏了很多次,现在我只是本能地不相信任何符号的右移。”MichaelBurr Andrewui的回答有这个问题,因为他在移动之前没有掩盖。