[討論] Sign Extension

看板Programming作者 (踩地雷啦)時間17年前 (2008/12/15 23:08), 編輯推噓3(308)
留言11則, 3人參與, 最新討論串1/1
一個有趣的問題 對一個整數從第n個bit做Sign Extension要怎麼做呢? 用組合語言的話,大部份的CPU都是只有兩個operation 先一個向左shift,再一個向右Arithmetic shift就完成了。 但是在我會的各種高階語言裡,如C,C++,Java,Perl,PHP,Tcl... 這似乎麻煩多了 不曉得大家遇到這樣的需求時, 是不是有什麼經典的好寫法呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.70.120

12/16 00:14, , 1F
Value |= ( ~((~0)>>n) )
12/16 00:14, 1F

12/16 00:15, , 2F
這樣該可以把0~n bit都set為1吧
12/16 00:15, 2F

12/16 09:02, , 3F
sign extension是要設MSB到n不是LSB到n
12/16 09:02, 3F

12/16 09:03, , 4F
而且還要先check第n-bit是否為1
12/16 09:03, 4F

12/16 09:14, , 5F
你自己不是有答案了?
12/16 09:14, 5F

12/16 09:15, , 6F
int x; (x << n) >> n;
12/16 09:15, 6F

12/16 09:18, , 7F
我第一行寫的確實是MSB到n啊
12/16 09:18, 7F

12/16 09:18, , 8F
你只要(signed)並且shift就可以達到了
12/16 09:18, 8F

12/16 09:19, , 9F
歐...我打0~n 確實是LSB到n,應該是n~MSB
12/16 09:19, 9F

12/16 11:04, , 10F
呀,感謝scaaa。將變數轉成sign就完成了
12/16 11:04, 10F

12/16 11:05, , 11F
但是perl就麻煩了,抓不準它的變數型別.
12/16 11:05, 11F
文章代碼(AID): #19HdBVR7 (Programming)