看板 Programming 關於我們 聯絡資訊
一個有趣的問題 對一個整數從第n個bit做Sign Extension要怎麼做呢? 用組合語言的話,大部份的CPU都是只有兩個operation 先一個向左shift,再一個向右Arithmetic shift就完成了。 但是在我會的各種高階語言裡,如C,C++,Java,Perl,PHP,Tcl... 這似乎麻煩多了 不曉得大家遇到這樣的需求時, 是不是有什麼經典的好寫法呢? -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.70.120
sunneo:Value |= ( ~((~0)>>n) ) 61.227.229.51 12/16 00:14
sunneo:這樣該可以把0~n bit都set為1吧 61.227.229.51 12/16 00:15
patterson:sign extension是要設MSB到n不是LSB到n 59.124.160.118 12/16 09:02
patterson:而且還要先check第n-bit是否為1 59.124.160.118 12/16 09:03
scaaa:你自己不是有答案了? 140.116.82.178 12/16 09:14
scaaa:int x; (x << n) >> n; 140.116.82.178 12/16 09:15
sunneo:我第一行寫的確實是MSB到n啊 61.227.228.73 12/16 09:18
sunneo:你只要(signed)並且shift就可以達到了 61.227.228.73 12/16 09:18
sunneo:歐...我打0~n 確實是LSB到n,應該是n~MSB 61.227.228.73 12/16 09:19
patterson:呀,感謝scaaa。將變數轉成sign就完成了 59.124.160.118 12/16 11:04
patterson:但是perl就麻煩了,抓不準它的變數型別. 59.124.160.118 12/16 11:05