function test($n){
return (~ $n ** 1 / 2)**2;
}
如果$n = 5
输出将为9
。为什么呢?
答案 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