C语言问题,按位与、按位或、按位异或、按位取反,解释下。

C语言问题,按位与、按位或、按位异或、按位取反,解释下。,第1张

先说一下布尔值的与、或、异或、反运算:

与运算,两者都为真计算结果为真,反之为假:

1 & 1 = 1,1 & 0 = 0,0 & 1 = 0,0 & 0 = 0;

或运算,至少其一都为真计算结果为真,反之为假:

1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0;

异或运算,两者不同为真,反之为假:

1 ^ 1 = 0,1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0;

取反运算,单目运算符:

~1 = 0,~0 = 1;

以上例子 1 代表真,0 代表假。

按位运算就是将二进制位的每一位进行如上计算。

如 2 | 5,转换为二进制(以 1 字节 8 位为例):

00000010 | 00000101,每个二进制位分别进行或运算后得:

00000111 即 7。虽然 7 = 5 + 2 但不代表 2 | 5 = 2 + 5。

如:2 | 6 = 6,5 | 6 = 7,2 | 4 | 5 | 6 | 7 = 7。

同理,按位与运算 2 & 5 的结果为 0:

00000010 & 00000101 = 00000000

按位与运算 2 & 6 的结果为 2(二进制 00000010):

00000010 & 00000110 = 00000010。

同样也能算出 2 ^ 6 的结果为 4(二进制 00000101):

00000010 ^ 00000110 = 00000100。

取反运算 ~00000110 = 11111001。

当然,对一个数字进行取反运算结果是多少,还与该类型是有符号还是无符号,占用的字节大小等有关。上面的例子只是以一个字节为例进行说明。

我感觉是这么回事,0x11二进制是表示是00010001,~之后是11101110,转化为十六进制后0xEE,这是在TC中整形2个字节,而在VC中整形是4个字节,所以

0x11转化为二进制时前面应该在补八个零,即0000000000010001~后为1111111111101110转为为十六进制后就为0xFFEE了。

c='\376';用这种方法的话转义编码是八进制数

这个376是八进制数,化为十进制是254,二进制为11111110,char的表示范围是-128~127,编译器将它理解为负数并且是补码形式,如化成原码,符号位1不变,后7位取反,最后加1,得到原码10000010,这就是-2

以上就是关于C语言问题,按位与、按位或、按位异或、按位取反,解释下。全部的内容,包括:C语言问题,按位与、按位或、按位异或、按位取反,解释下。、C语言中的取反是什么意思啊、C语言中,如何取反+1等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/zz/10139307.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-05
下一篇 2023-05-05

发表评论

登录后才能评论

评论列表(0条)

保存