作者patterson (踩地雷啦)
看板Programming
标题[讨论] Sign Extension
时间Mon Dec 15 23:08:14 2008
一个有趣的问题
对一个整数从第n个bit做Sign Extension要怎麽做呢?
用组合语言的话,大部份的CPU都是只有两个operation
先一个向左shift,再一个向右Arithmetic shift就完成了。
但是在我会的各种高阶语言里,如C,C++,Java,Perl,PHP,Tcl...
这似乎麻烦多了
不晓得大家遇到这样的需求时,
是不是有什麽经典的好写法呢?
--
※ 发信站: 批踢踢实业坊(ptt.cc)
◆ From: 140.113.70.120
1F:推 sunneo:Value |= ( ~((~0)>>n) ) 61.227.229.51 12/16 00:14
2F:→ sunneo:这样该可以把0~n bit都set为1吧 61.227.229.51 12/16 00:15
3F:→ patterson:sign extension是要设MSB到n不是LSB到n 59.124.160.118 12/16 09:02
4F:→ patterson:而且还要先check第n-bit是否为1 59.124.160.118 12/16 09:03
5F:推 scaaa:你自己不是有答案了? 140.116.82.178 12/16 09:14
6F:→ scaaa:int x; (x << n) >> n; 140.116.82.178 12/16 09:15
7F:推 sunneo:我第一行写的确实是MSB到n啊 61.227.228.73 12/16 09:18
8F:→ sunneo:你只要(signed)并且shift就可以达到了 61.227.228.73 12/16 09:18
9F:→ sunneo:欧...我打0~n 确实是LSB到n,应该是n~MSB 61.227.228.73 12/16 09:19
10F:→ patterson:呀,感谢scaaa。将变数转成sign就完成了 59.124.160.118 12/16 11:04
11F:→ patterson:但是perl就麻烦了,抓不准它的变数型别. 59.124.160.118 12/16 11:05