C语言 按位取反
作者&投稿:夫莉 (若有异议请与网页底部的电邮联系)
你这里的0001应该是有符号的
那么执行~0001后 为1110(内存中就是这样存储0001取反的结果的)
这个是结果是以补码的方式存储的
但是真真的显示的时候往往用原码就是1010了<最高位为符号位,这里为1
就是负号, 010为2,所以结果为-2,原码的显示是为了直观,真真的运算都
是以补码来运算的>
~0001的结果就是-2,-2的原码为1010,补码为1110
25在内存中的存储为:0000000000011001
就有~25=1111111111100110<内存中这样储存这个结
果>
用原码来显示:~25的原码为补码取反+1
那么就为:1000000000011001+1=1000000000011010
最高位为符号位这里为负号, 000000000011010=26
所以结果为:-26
c语言的逻辑运算包括与、或、非
按位取反使用运算符~
如0xff按位取反为~(0xff)
按位取反后的结果为0x00
需要注意的是,c语言中的逻辑运算&和&&是不同的
0xff&0xa0=0xa0
而0xff&&0xa0=1
一个运算符是按位操作
其返回值是按位操作的结果
两个运算符是逻辑表达式,其返回值只有0和1
2的原码是00000010
那么-2 的原码为10000010取反得反码11111101,末尾加1得补码11111110
取反后就为00000001,不就是1吗
不对,正数的原码补码和原码相同,负数才按上面的方法来求
a为int类型 通常占4个字节
2的原码:0000 0000 0000 0000 0000 0000 0000 0010
取反: 1111 1111 1111 1111 1111 1111 1111 1101
最高位是1所以是负数,求其原始数据,方法是
再次取反加1(符号位不变)
取反: 1000 0000 0000 0000 0000 0000 0000 0010
加1 1000 0000 0000 0000 0000 0000 0000 0011
所以是 -3
公式:
补码 = 反码 + 1
-2 在计算机中的补码形式为:0xFFFFFFFE
按位取反成为:0x000000001
--------------------------------------
2 十六进制为: 0x00000002
反码为:0xFFFFFFFD
反码+1 = 0xFFFFFFE(这就是-2)
2的二进制: 0000 0010
-2的二进制:1111 1110
~-2: 0000 0001
负数的二进制表示方法:第一位符号位,然后取无符号部分取反后加1,得出负数的二进制表示。
按位取反运算符(~)
按位取反运算是单目运算,用来求一个位串信息按位的反,即哪些为0的位,结果是1,而哪些为1的位,结果是0。例如, ~7的结果为0xfff8。
取反运算常用来生成与系统实现无关的常数。如要将变量x最低6位置成0,其余位不变,可用代码x = x & ~077实现。以上代码与整数x用2个字节还是用4个字节实现无关。
当两个长度不同的数据进行位运算时(例如long型数据与int型数据),将两个运算分量的右端对齐进行位运算。如果短的数为正数,高位用0补满;如果短的数为负数,高位用1补满。如果短的为无符号整数,则高位总是用0补满。
位运算用来对位串信息进行运算,得到位串信息结果。如以下代码能取下整型变量k的位串信息的最右边为1的信息位:((k-1)^k) & k。
移位运算
曲泼鱼腥: a=~a, 取反有两种“!”“~” !符号是位取反(是“位”),只针对位变量. ~符号是按位取反(是“按位”),针对字节变量 但在C中可以互换,
沙县18568424956: C语言中按位取反的问题 - ?
曲泼鱼腥: 0001 取反 1110符号位为1,取反+1为 1010 转化成10进制为 -2
沙县18568424956: C语言问题,按位与、按位或、按位异或、按位取反,解释下. - ?
曲泼鱼腥: 先说一下布尔值的与、或、异或、反运算: 与运算,两者都为真计算结果为真,反之为假: 1 & 1 = 1,1 & 0 = 0,0 & 1 = 0,0 & 0 = 0; 或运算,至少其一都为真计算结果为真,反之为假: 1 | 1 = 1,1 | 0 = 1,0 | 1 = 1,0 | 0 = 0; 异或运算,两者不同为...
沙县18568424956: C语言,按位取反的时候怎么运算的!为什么~1的运算结果是﹣2 - ?
曲泼鱼腥: 1的二进制表示是0000 0000 0000 0001,用~取反就是1111 1111 1111 1110 这个是补码,因为在位运算符中出现的数都是以二进制补码形式出现,你可以去翻书看看.补码=反码+1.所以将这个数减去1,再取反转换成原码(取反除符号位):即是1000 0000 0000 0010 所以~1的结果等于 -2
沙县18568424956: C语言位运算取反问题? - ?
曲泼鱼腥: 首先你输出是肯定用的 printf("%d",~a). int类型数据是有范围的 -32768~32767 [100]原=0000 0000 0110 0100 取反后为1111 1111 1001 1011 这个数值已远远超出了范围,发生溢出. 但是这个数值是-101的补码,而计算机数字都是按补码存储的,所以他输出了-101. 你放成ld,数值又不同.
沙县18568424956: c语言中的位运算符中'按位取反'是怎么运算的,什么是负数的反码,请各位帮我解释一下!!! - ?
曲泼鱼腥: 0001 取反 1110 符号位为1,取反+1为 1010 转化成10进制为 -2 正数的原码,补码,反码都相同,都等于它本身 负数的补码是:符号位为1,其余各位求反,末位加1 反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1...
沙县18568424956: c语言按位取反如何弄出32个0 - ?
曲泼鱼腥: 定义一个变量,给一个变量赋值32个1,再对次变量按位取反,就得到了32个0了
沙县18568424956: c语言中的位运算符中'按位取反'是怎么运算的 - ?
曲泼鱼腥: ~1010的反码是0101 而负数在计算机中的表示是用补码,-11求补码过程:1011取反->0100加1->0101 即-11等价于~10 括号中的是0101 补充说明:是这样的,1010在32位计算机中的存储实际上是00001010,取反后是11110101,在计算机中首位是0表示正数,是1表示负数,即11110101表示的是一个负数,即要由11110101求这个负数,即求补码的逆,步骤:先减1得11110100,再取反,取反时符号位不变,得10001011,即-11.用4位表示的话可以填0101,或者是8位的11110101
沙县18568424956: C语言中的位运算符'"~"是怎么取反的 - ?
曲泼鱼腥: int型整数有正负号,用补码表示.2的取反是 11111111 11111111 11111111 11111101,是负数.这个负数的十进制绝对值可用“取反加1“获得:即00000000 00000000 00000000 00000011 ,就是3.绝对值为3的负数,就是-3.如果a是unsigned型的整数,转换成十进制用的是原码而不是补码,~a就是一个很大的正数.
沙县18568424956: 关于c语言按位取反的运算 - ?
曲泼鱼腥: 0x11=0x0011= 0000 0000 0001 0001(不用转成十进制再转二进制,太麻烦,一个16进制的位直接转成四位二进制的位就可以了) 再取反就得到1111 1111 1110 1110即0xFFEE 问题的关键是要把位补齐了,前面的0不能省了呀