Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C语言中的二进制运算_C_Binary_Char - Fatal编程技术网

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的回答有这个问题,因为他在移动之前没有掩盖。