你能解释一下(〜不是按位)吗?

时间:2017-06-14 12:42:40

标签: bitwise-operators

function test($n){
return (~ $n ** 1 / 2)**2;
}

如果$n = 5 输出将为9。为什么呢?

1 个答案:

答案 0 :(得分:1)

按位非运算符~只是翻转给定数字中的每一位,零变为1,1变为零。在这种情况下,您$n为5,二进制为101。但是,正如您所知,计算机中的数字具有固定的位大小;大多数情况下它都是32位,但我们可以说这个例子中我们有8位数字。然后5实际上是0000 0101。现在,如果您对此号码应用~运算符,则会获得1111 0101。这个数字实际上是十进制表示法中的245。但是,根据two's complement convention,您很可能使用有符号整数,这意味着第一位设置为1的数字实际上是负数。一般规则很简单:给定一个数字 n ,应用按位非操作会给出 - n - 1(与位大小无关)。这意味着在这种情况下我们会得到-6。因此,考虑到运算符优先级,最终结果将是:

((((~5) ** 1) / 2) ** 2) = ((((-6) ** 1) / 2) ** 2) = ((-3) ** 2) = 9