作者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