帮我解决一下C语言的题目 位运算

来源:百度知道 编辑:UC知道 时间:2024/05/14 05:33:23
main()
{
int m1=045,m2=023;
printf("%x,%x,%x,%x,%x\n",m1&m2,m1|m2,m1^m2,~m1,~m2);
return 0;
}
要求给出详细求解过程。

首先解释下基础知识
位运算,是按二进制位计算,要把运算量变为二进制进行对位计算
&位与,两运算量,若都是1运算结果是1,其他情况结果为0
|位或,两运算量,若都是0运算结果是0,其他情况结果为1
^位异或,两运算量,若相同,运算结果是0,不相同,结果为1
~位非,单运算量,取反,1为0,0为1
%x,结果按照16进制输出
045,这样的数据,前面一个0表示其是八进制数据,而不是十进制
由于,int数据要求2个字节,所以转换后不足16位要扩充
计算:
首先把m1和m2变为2进制数据(可先转为十进制,再转为2进制,我直接出结果,这不是什么难事)
m1=00000000 00100101
m2=00000000 00010011

m1&m2:
00000000 00000001
十六进制:1

m1|m2:
00000000 00110111
十六进制:37

m1^m2
00000000 00110110
十六进制:36

~m1:
11111111 11011010
十六进制:FFDA

~m2:
11111111 11101100
十六进制:EC

所以输出结果是:
1,37,36,ffda,ffec

先把m1化为二进制数m1=045 一看就知道是八进制的。因为45前面有个0就说明了。化为二进制后m1=100101
同理,m2=010011
m1&m2的解法:
m1=100101
m2=010011
----------
000001
m1&m2=000001
m1|m2的解法:
m1=100101
m2=010011
----------
110111
m1|m2=110111
m1^m2的解法:
m1=100101
m2=0