c语言中的位运算符中‘按位取反’是怎么运算的

   更新日期:2024.05.19

使用~按位取反运算的时候,计算机会将操作数所对应的二进制表达式的每一个位进行取反计算,取反后所得到的值就是~按位取反的运算结果。

例如,假如计算机是32位的,接下来要计算~5的值,计算过程如下:

5 的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101

执行~运算,即~5后: 1111 1111 1111 1111 1111 1111 1111 1010,即结果为-6

以上过程没有任何问题,但如果忘记了负数的二进制表达方式,那么就会对这个结果产生疑问,为什么1111 1111 1111 1111 1111 1111 1111 1010表示-6,可能会以为它应该表示-10等等,所以,使用~按位取反的另一个关键就是理解1111 1111 1111 1111 1111 1111 1111 1010为什么表示-6,也即理解负数的二进制表达方式。

扩展资料

js取整

~是按位取反运算,~~是取反两次

在这里~~的作用是去掉小数部分

因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数

除了~~n 还可以用

n<<0

n>>0

n|0



~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

位运算中的按位取反操作,使用的运算符为~, 其计算原则为:
按照操作数的二进制值,逐位计算,如果原始值为0,则结果该位上为1, 否则结果该位上为0。
比如char类型的0x78按位取反
~0x78
=~B0111 1000//转为二进制值。
=B1000 0111//按位取反。
=0x87

计算机存储的数不是只有4位的
像32位计算机,存储int类型的数就用32位
所以上面10的二进制码1010,前面还有好多0,取反的时候要一起取反

简单的话,以8位二进制码为例
括号中就是11110101,也就是00001010取反的结果

这是补码

-10的补码是10的补码(正数的补码就是原码)取反加1
既然这里只取反没加1,所以就是-10-1=-11

数转补码
正数就是二进制码
负数是相反数(即取绝对值)的二进制码取反加1

补码转数
正数(二进制最高位为0)直接转
负数(二进制最高位为1)减1取反转成十进制进制数再加个负号

C语言经典例子之按位取反运算符



  • 18619116474 :c语言中的位运算符中‘按位取反’是怎么运算的
    师剂阳4375 :答:使用~按位取反运算的时候,计算机会将操作数所对应的二进制表达式的每一个位进行取反计算,取反后所得到的值就是~按位取反的运算结果。例如,假如计算机是32位的,接下来要计算~5的值,计算过程如下:5 的二进制表达式为:0000 0000 0000 0000 0000 0000 0000 0101 执行~运算,即~5后: 1111 11...
  • 18619116474 :c语言中的位运算符中‘按位取反’是怎么运算的,什么是负数的反码,请各...
    师剂阳4375 :答:反码是:符号位为1,其余各位求反,但末位不加1 也就是说,反码末位加上1就是补码 1100110011 原 1011001100 反 除符号位,按位取反 1011001101 补 除符号位,按位取反再加1 正数的原反补是一样的 在计算机中,数据是以补码的形式存储的:在n位的机器数中,最高位为符号位,该位为零表示为正,为...
  • 18619116474 :C语言中取反运算符'"!"如何使用?
    师剂阳4375 :答:int a=10, b, c;b = !a; // 运算后b=0,因为a不等于0(即为真),所以取非后等于0(为假)c = ~a; // 运算后c=5,因为a的二进制位1010,按位取反后变为0101(即等于5)
  • 18619116474 :c语言中有哪些运算符按位取反?
    师剂阳4375 :答:(取反、左移、按位与、按位异或、按位或)优先级由高到低的顺序排列为取反 > 左移 > 按位与 > 按位异或 > 按位或。1、~:意思是按位取反,类似于非(!)的关系,取它的反面。2、<<: 意思是左移,移动二进制的位。3、& : 意思是按位与,类似于与(&&)的关系,一假为假。4、...
  • 18619116474 :关于c语言按位取反的运算
    师剂阳4375 :答:两者都为1为1,否则为0。1&1=1,1&0=0,0&1=0,0&0=0 或运算:| 两者都为0为0,否则为1 1|1=1,1|0=1,0|1=1,0|0=0 非运算:~1取0,0取1 ~1=0,~0=1 ~(10001)=01110 异或运算 两者相等为0,不等为1 1^1=0,1^0=1,0^1=1,0^0=0 ...
  • 18619116474 :C语言,按位取反的时候怎么运算的!为什么~1的运算结果是﹣2_百度知 ...
    师剂阳4375 :答:按位取反之后为 1111 1111 1111 1111 1111 1111 1111 1110 有符号的数最高位为1表示负数 负数的补码是其原码取反加1 取补码:1000 0000 0000 0000 0000 0000 0000 0010 结果为-2 -2的二进制为2的反码取补码:原码:0000 0000 0000 0000 0000 0000 0000 0010 反码:1111 1111 1111 1111 1111...
  • 18619116474 :C语言中按位异或和按位取反什么去区别?
    师剂阳4375 :答:1 ^ 0 = 1,0 ^ 1 = 1,0 ^ 0 = 0;取反运算,单目运算符:~1 = 0,~0 = 1;以上例子 1 代表真,0 代表假。按位运算就是将二进制位的每一位进行如上计算。如 2 | 5,转换为二进制(以 1 字节 8 位为例):00000010 | 00000101,每个二进制位分别进行或运算后得:00000111 ...
  • 18619116474 :c语言,按位取反。
    师剂阳4375 :答:C语言的逻辑运算包括与、或、非 按位取反使用运算符~如0xFF按位取反为~(0xFF)按位取反后的结果为0x00 需要注意的是,C语言中的逻辑运算&和&&是不同的 0xFF&0xA0=0xA0 而0xFF&&0xA0=1 一个运算符是按位操作 其返回值是按位操作的结果 两个运算符是逻辑表达式,其返回值只有0和1 ...
  • 18619116474 :C与C++中按位取反(~)的问题
    师剂阳4375 :答:中的d e f 均为无符号数值类型 所以输出的时候不能再用“%d”这个有符号整型转义符了 正确的输出方法如下 printf("%d\n%d\n%d\n%hu\n%lu\n%lu\n",~a,~b,~c,~d,~e,~f);hu 是无符短整型 %lu是无符长整型。因为unsigend long 和 unsigned int都是四字节,所以都用%lu表示。修改程序...
  • 18619116474 :C语言按位取反?
    师剂阳4375 :答:~10的计算步骤:转二进制:0 1010 计算补码:0 1010 按位取反:1 0101 转为原码:1 0101 按位取反:1 1010 反码 末位加一:1 1011 补码 符号位为1是负数,即-11 规律:~x=-(x+1);因此,t=~10(1010)==-11;
  • 相关链接

    欢迎反馈与建议,请联系电邮
    2024 © 视觉网