php二进制应用位运算,PHP: 位运算符 - Manual

示例 #3 整数的位移

* Here are the examples.

*/echo"\n--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---\n";$val=4;$places=1;$res=$val>>$places;p($res,$val,'>>',$places,'copy of sign bit shifted into left side');$val=4;$places=2;$res=$val>>$places;p($res,$val,'>>',$places);$val=4;$places=3;$res=$val>>$places;p($res,$val,'>>',$places,'bits shift out right side');$val=4;$places=4;$res=$val>>$places;p($res,$val,'>>',$places,'same result as above; can not shift beyond 0');

echo"\n--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---\n";$val= -4;$places=1;$res=$val>>$places;p($res,$val,'>>',$places,'copy of sign bit shifted into left side');$val= -4;$places=2;$res=$val>>$places;p($res,$val,'>>',$places,'bits shift out right side');$val= -4;$places=3;$res=$val>>$places;p($res,$val,'>>',$places,'same result as above; can not shift beyond -1');

echo"\n--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---\n";$val=4;$places=1;$res=$val<

echo"\n--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---\n";$val= -4;$places=1;$res=$val<

* Ignore this bottom section,

* it is just formatting to make output clearer.

*/functionp($res,$val,$op,$places,$note='') {$format='%0'. (PHP_INT_SIZE*8) ."b\n";printf("Expression: %d = %d %s %d\n",$res,$val,$op,$places);

echo" Decimal:\n";printf("  val=%d\n",$val);printf("  res=%d\n",$res);

echo" Binary:\n";printf('  val='.$format,$val);printf('  res='.$format,$res);

if ($note) {

echo" NOTE:$note\n";

}

echo"\n";

}?>

以上例程在 32 位机器上的输出:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---

Expression: 2 = 4 >> 1

Decimal:

val=4

res=2

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000000010

NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2

Decimal:

val=4

res=1

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000000001

Expression: 0 = 4 >> 3

Decimal:

val=4

res=0

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000000000

NOTE: bits shift out right side

Expression: 0 = 4 >> 4

Decimal:

val=4

res=0

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000000000

NOTE: same result as above; can not shift beyond 0

--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---

Expression: -2 = -4 >> 1

Decimal:

val=-4

res=-2

Binary:

val=11111111111111111111111111111100

res=11111111111111111111111111111110

NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2

Decimal:

val=-4

res=-1

Binary:

val=11111111111111111111111111111100

res=11111111111111111111111111111111

NOTE: bits shift out right side

Expression: -1 = -4 >> 3

Decimal:

val=-4

res=-1

Binary:

val=11111111111111111111111111111100

res=11111111111111111111111111111111

NOTE: same result as above; can not shift beyond -1

--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---

Expression: 8 = 4 << 1

Decimal:

val=4

res=8

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000001000

NOTE: zeros fill in right side

Expression: 1073741824 = 4 << 28

Decimal:

val=4

res=1073741824

Binary:

val=00000000000000000000000000000100

res=01000000000000000000000000000000

Expression: -2147483648 = 4 << 29

Decimal:

val=4

res=-2147483648

Binary:

val=00000000000000000000000000000100

res=10000000000000000000000000000000

NOTE: sign bits get shifted out

Expression: 0 = 4 << 30

Decimal:

val=4

res=0

Binary:

val=00000000000000000000000000000100

res=00000000000000000000000000000000

NOTE: bits shift out left side

--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---

Expression: -8 = -4 << 1

Decimal:

val=-4

res=-8

Binary:

val=11111111111111111111111111111100

res=11111111111111111111111111111000

NOTE: zeros fill in right side

Expression: -2147483648 = -4 << 29

Decimal:

val=-4

res=-2147483648

Binary:

val=11111111111111111111111111111100

res=10000000000000000000000000000000

Expression: 0 = -4 << 30

Decimal:

val=-4

res=0

Binary:

val=11111111111111111111111111111100

res=00000000000000000000000000000000

NOTE: bits shift out left side, including sign bit

以上例程在 64 位机器上的输出:

--- BIT SHIFT RIGHT ON POSITIVE INTEGERS ---

Expression: 2 = 4 >> 1

Decimal:

val=4

res=2

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000000010

NOTE: copy of sign bit shifted into left side

Expression: 1 = 4 >> 2

Decimal:

val=4

res=1

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000000001

Expression: 0 = 4 >> 3

Decimal:

val=4

res=0

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000000000

NOTE: bits shift out right side

Expression: 0 = 4 >> 4

Decimal:

val=4

res=0

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000000000

NOTE: same result as above; can not shift beyond 0

--- BIT SHIFT RIGHT ON NEGATIVE INTEGERS ---

Expression: -2 = -4 >> 1

Decimal:

val=-4

res=-2

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=1111111111111111111111111111111111111111111111111111111111111110

NOTE: copy of sign bit shifted into left side

Expression: -1 = -4 >> 2

Decimal:

val=-4

res=-1

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=1111111111111111111111111111111111111111111111111111111111111111

NOTE: bits shift out right side

Expression: -1 = -4 >> 3

Decimal:

val=-4

res=-1

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=1111111111111111111111111111111111111111111111111111111111111111

NOTE: same result as above; can not shift beyond -1

--- BIT SHIFT LEFT ON POSITIVE INTEGERS ---

Expression: 8 = 4 << 1

Decimal:

val=4

res=8

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000001000

NOTE: zeros fill in right side

Expression: 4611686018427387904 = 4 << 60

Decimal:

val=4

res=4611686018427387904

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0100000000000000000000000000000000000000000000000000000000000000

Expression: -9223372036854775808 = 4 << 61

Decimal:

val=4

res=-9223372036854775808

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=1000000000000000000000000000000000000000000000000000000000000000

NOTE: sign bits get shifted out

Expression: 0 = 4 << 62

Decimal:

val=4

res=0

Binary:

val=0000000000000000000000000000000000000000000000000000000000000100

res=0000000000000000000000000000000000000000000000000000000000000000

NOTE: bits shift out left side

--- BIT SHIFT LEFT ON NEGATIVE INTEGERS ---

Expression: -8 = -4 << 1

Decimal:

val=-4

res=-8

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=1111111111111111111111111111111111111111111111111111111111111000

NOTE: zeros fill in right side

Expression: -9223372036854775808 = -4 << 61

Decimal:

val=-4

res=-9223372036854775808

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=1000000000000000000000000000000000000000000000000000000000000000

Expression: 0 = -4 << 62

Decimal:

val=-4

res=0

Binary:

val=1111111111111111111111111111111111111111111111111111111111111100

res=0000000000000000000000000000000000000000000000000000000000000000

NOTE: bits shift out left side, including sign bit

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值