本文主要是介绍(按位取反)运算的理解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
(按位取反)运算的理解:
按照我平时的理解,当我使用~按位取反运算的时候,计算机会将操作数所对应的二进制表达式的每一个位进行取反计算,取反后所得到的值就是~按位取反的运算结果(这点没问题)
例如,假如我的计算机是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,也即理解负数的二进制表达方式。
现在计算机普遍使用补码表示负数。知道一个数的补码,要求其值的方法是:首先看符号位也就是最左的一位,如果是1代表是负数(-)如果是0代码是正数(+),然后对该值取反再+1,得到其源码。
例如本例中得到的 1111 1111 1111 1111 1111 1111 1111 1010,其符号位(最左一位)是1,表明它表示的是负数,欲求其源码,需先对其取反,然后再加1:0000 0000 0000 0000 0000 0000 0000 0101 + 1 = 0000 0000 0000 0000 0000 0000 0000 0110,然后在得到的源码前加一个负号,即-0000 0000 0000 0000 0000 0000 0000 0110 = -6。以上便是对~按位取反运算以及负数的二进制表示的理解,不难发现,在求源码的时候,要将补码进行取反后再加1,然而这个补码原本就是之前由~运算时,对原来的操作数通过~按位取反而得来的,所以,此时在求该补码的源码时的取反操作,相当于将补码变回了原来的那个操作数,之后进行的加1操作就相当于对原来的操作数进行加1,只不过结果变成了他的相反数。
因此,可以总结出~按位取反的计算结论是:~n = -(n+1)
例如本例中,~5 = -(5+1),即~5 = -6
---------------------
出處
js取整
~是按位取反运算,~~是取反两次
在这里~~的作用是去掉小数部分
因为位运算的操作值要求是整数,其结果也是整数,所以经过位运算的都会自动变成整数
除了~~n 还可以用
n<<0
n>>0
n|0
这篇关于(按位取反)运算的理解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!