意外的按位运算结果

时间:2013-08-25 16:34:44

标签: php bit-manipulation

考虑:

php > $a = 12; // 1100
php > echo ~$a;
-13

我希望1100的倒数可以是0011(直接)或11110011(整个字节)。这会给3243带来结果。从哪来来-13

同样,为了更好的衡量,同一类型和解释的另一个意外结果:

php > $b =  6; // 0110
php > echo ~$b;
-7

为什么-7

2 个答案:

答案 0 :(得分:1)

  

为什么-7?

600000000000000000000000000000110,因此~6~00000000000000000000000000000110,且等于11111111111111111111111111111001。由于使用了带符号的数据类型,因此第一位指示数字是正数还是负数(正数= 0和负数= 1)。因为它是Two's complement,所以你应该用这种方式将二进制数转换为十进制:

  1. 反转二进制数。得到00000000000000000000000000000110
  2. 00000000000000000000000000000110(正二进制数)转换为十进制数。得到6
  3. 添加6一个:您获得7
  4. 将其设为否定:您获得-7

答案 1 :(得分:1)

看看这段代码:

<?php
$val = 6;

print "$val = ".decbin($val);
print "\n";
$val = ~$val;
print "$val = ".decbin($val);

打印

6 = 110
-7 = 11111111111111111111111111111001

首先你有110.由于我的php使用32位,在反转所有位后,我们得到这个巨大的数字。当第1位为1时,php将其解释为负值,使用二进制补码表示进行存储。为了找出,负值的模数,存储在这种表示法中,我们

  1. 反转数字:
  2. 110

    1. 在结果中添加一个:
    2. 111

      给了我们7

      所以,值是-7

      http://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html