作者CindyLinz (Cindy Wang)
看板Perl
标题Re: [问题] 'AND' bitwise 运算
时间Tue Nov 24 15:50:46 2015
※ 引述《CindyLinz (Cindy Wang)》之铭言:
: ※ 引述《rkcity (喵。罐头)》之铭言:
: : 今天在写个小tool的时候发现
: : Perl 的 & 运算好像怪怪的...
: : Source:
: : $value = 4294967296;
: : print ($value & 0xFFFFFFFF);
: : Output:
: : 4294967295
: : Expect:
: : 预期应该是0
: : Excute Perl Online:
: : http://codepad.org/9qM322Vf
: : 最後我用mod先解掉了..
: : 似乎是只要大於4294967295(0xFFFFFFFF) 就会这样
: : 即使mask设成 0x00000000FFFFFFFF 也是一样结果
: : 请问这有办法解决吗?
: 你的 Perl 是 32bits 版本 (大概你的机器环境是 32bits 的?),
: 所以无号整数的范围最大是 4294967295,
: 常数写超过的时候 Perl 会让它停在这个最大值..
: 解法... 可以找 64bits 机器环境使用 64bits 的 Perl.. ^^|
: (嗯, 因为不知道你真实的需求是什麽, 如果只看这几行的话,
: 直接写 print 0 可能是最佳解? ^^|)
: --
:
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 112.121.78.5
: ※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1448301557.A.424.html
: 推 rkcity: 哈哈哈 感谢回覆 环境是32bit 11/24 09:34
: 推 rkcity: 需求是我现在需要做一个计算不同checksum的tool。其中一 11/24 09:38
: → rkcity: 种是计算所有数值的加总 但是必须放回32bit register 11/24 09:39
: → rkcity: 用C的话overflow部分会直接被吃掉 不会像perl停留在最大值 11/24 09:40
: 推 abliou: 太厉害了!! 11/24 13:22
欸~ 可以考虑局部 use bigint;
像这样子
# 这边是平常的计算模式
{ # 这个 block 里面使用 bigint 计算模式
use bigint;
my $a = 18446744073709551616;
# 2**64 (因为我的环境是 64bits 的, 所以我试这个会出界的例子)
$a **= 3;
# 让它更出界一点 (?
print $a,$/;
# 这边会印出 6277101735386680763835789423207666416102355444464034512896
}
# 这边恢复平常的计算模式
--
※ 发信站: 批踢踢实业坊(ptt.cc), 来自: 112.121.78.5
※ 文章网址: https://webptt.com/cn.aspx?n=bbs/Perl/M.1448351448.A.564.html
1F:推 abliou: Cindy是好人!! 11/24 16:05
2F:→ Neisseria: 这招不错,笔记一下 11/24 22:21
3F:推 rkcity: 感谢Cindy大 11/24 23:16
4F:推 cutekid: 推(Y) 11/26 15:20
5F:推 uefang: 推 04/01 22:18