[問題] 詢問C sign extension的方法

看板C_and_CPP作者 (我不想"擦肩而過")時間14年前 (2009/08/27 17:47), 編輯推噓6(609)
留言15則, 6人參與, 最新討論串1/1
請問各位大大我有一個32bits資料 存在站存器 uint32 DATA 中 然後我要將DATA中的資料SHIFT右移16bit 所以我程式就打 result=(DATA)>>16; 但是我的result出來要如何讓前面補的16bit有"sign extension的效果" EX: 若DATA=1000 1000 1000 1000 1000 1000 1000 1000 (32bits) ^ sign bit 那我 >>16 SHIFT 我希望結果我要的是 result=1111 1111 1111 1111 1000 1000 1000 1000 ___________________ ^ sign extension sign bit(shift後) thx by dczhang -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 140.113.149.173

08/27 18:01, , 1F
要嘛改用signed, 要嘛判斷最高bit為1就|前0xFFFF0000 ??
08/27 18:01, 1F

08/27 18:06, , 2F
抱歉請問要怎抓bit我突然想到,若我要抓DATA的第29個bits
08/27 18:06, 2F

08/27 18:09, , 3F
#define BITN(n) (0x1<<(n)) //隨手寫的沒有測過....
08/27 18:09, 3F

08/27 18:10, , 4F
(data >> 29) & 0x01
08/27 18:10, 4F

08/27 18:11, , 5F
話說, int sData = *(int*)&DATA, 然後拿sData>>也行吧.
08/27 18:11, 5F

08/27 18:15, , 6F
請問我原來的DATA要>>16,如果又要多一個>>29會資源太大嗎
08/27 18:15, 6F

08/27 18:17, , 7F
32 bit data >> 16 又 >> 29 還剩下些什麼??
08/27 18:17, 7F

08/27 18:17, , 8F
順便說, 這種原生型態的bit operation速度很快的....
08/27 18:17, 8F

08/27 18:29, , 9F
因為我是做FFT的一堆算術運算,>>16,>>29只是其中一段
08/27 18:29, 9F

08/27 18:31, , 10F
而事實上我DATA是要>>12 ,再補弟29為sign bit
08/27 18:31, 10F

08/27 18:36, , 11F
只要是 signed 那麼右移之後都會自動補上 sign extension
08/27 18:36, 11F
謝謝各物大大指教我改好了,給你們看一下這樣是否可以 e = (((data[i+40]>>3)*coeff[20])&0x3ffff000); //e的資料為第29~12 bits共18bits //以下作判斷>>12是否要sign extension if ((e & 20000000) == 0x20000000){ //CHECK 第29bit是否為1 tmp32R[i+40]= 0xFFFC0000|(e>>12);} //若有就做1的sign extension else tmp32R[i+40]= e>>12; //結果放在 tmp32R[i+40] ※ 編輯: dczhang 來自: 140.113.149.173 (08/27 18:53)

08/27 20:38, , 12F
e & 0x20000000
08/27 20:38, 12F

08/28 00:26, , 13F
bit operation 一直都很快 除了 P4 的 shift XD
08/28 00:26, 13F

08/28 00:43, , 14F
((signed(e) << 2) >> 14) 這樣如何 ?
08/28 00:43, 14F

08/28 12:56, , 15F
我試試看樓上大大看看唷^^謝謝
08/28 12:56, 15F
文章代碼(AID): #1AbbOcTa (C_and_CPP)