創作內容

2 GP

融合及融合解除兩個整數

作者:likwueron│2014-01-11 19:04:40│巴幣:4│人氣:171
SDL支援一個現在不常見的搖桿裝置:軌跡球(Trackball)
說到那顆球嘛,我就想到以前有些滑鼠的「球」是長在上面的。

下面是SDL中取得軌跡球的函式。
int SDL_JoystickGetBall(SDL_Joystick * joystick, int ball, int *dx, int *dy);

這函式長得和其它的傢伙不同,它有兩個「回傳值」,嗯,我是說我們重視是dx和dy這兩個值。
但這下問題來了,我們要怎麼把它們變成一個變數,好讓它們看起來和其它傢伙一樣?

問題:將兩個32-bit的整數合成一個64-bit的整數

簡單的想法就是把第一個數 位移 32個bit,再和第二個數黏起來。
int a, b;
long long fusion = (long long(a) << 32) | b;

int a2 = fusion >> 32;
int b2 = fusion;


不過,在碰上了負數時我們有了麻煩,融合解除後第一個數和原來的不同。
雖然,如果我是敵方,用了融合解除後能把一隻怪獸變殘廢會很高興啦...

用一個比較簡單的模型來思考好了,比如把兩個4-bit裝進1個8-bit中。
對a來說:0111 ==轉成8-bit=> 0000 0111 ==位移=> 0111 0000
對b來說:1001 ==轉成8-bit=> 1111 1001
很明顯的,負數在轉成8-bit後會補1而非0,所以造成我們的融合的數值不正確。(所以有問題的是融合)
那麼,我們要用哪一個方法去除多出來的1,但又不影響我們的原本的值呢?
仔細想了一個下午(喂!),最後想到讓b和0000 1111作AND運算就能達成這個目的。
套用在32-bit合成64-bit中,就是前32個bit是0,後32個bit是1。
int a, b;
long long bx = b;
if(b < 0) {
    bx &= 0xffffffff;
}
long long fusion = (long long(a) << 32) | bx;

int a2 = fusion >> 32;
int b2 = fusion;


但寫完後...突然想到...用struct來處理不是更簡單嗎?
引用網址:https://home.gamer.com.tw/TrackBack.php?sn=2306216
Some rights reserved. 姓名標示-非商業性 2.5 台灣

相關創作

同標籤作品搜尋:C|位元運算

留言共 0 篇留言

我要留言提醒:您尚未登入,請先登入再留言

2喜歡★iqandadie 可決定是否刪除您的留言,請勿發表違反站規文字。

前一篇:光學字元辨認... 後一篇:素泡麵...

追蹤私訊切換新版閱覽

作品資料夾

ShuLongQinHu大家
小屋更新~鋼彈W的同人插圖 傑克斯特尉 歡迎來看看!看更多我要大聲說11小時前


face基於日前微軟官方表示 Internet Explorer 不再支援新的網路標準,可能無法使用新的應用程式來呈現網站內容,在瀏覽器支援度及網站安全性的雙重考量下,為了讓巴友們有更好的使用體驗,巴哈姆特即將於 2019年9月2日 停止支援 Internet Explorer 瀏覽器的頁面呈現和功能。
屆時建議您使用下述瀏覽器來瀏覽巴哈姆特:
。Google Chrome(推薦)
。Mozilla Firefox
。Microsoft Edge(Windows10以上的作業系統版本才可使用)

face我們了解您不想看到廣告的心情⋯ 若您願意支持巴哈姆特永續經營,請將 gamer.com.tw 加入廣告阻擋工具的白名單中,謝謝 !【教學】