EntryNavi : « MG ガンダム Mk-Ⅱ vol 2 | メイン | /Wp64 (64 ビット移植性の問題の検出) »

CategoryNavi : メイン -> コンピューター -> 開発 -> C/C++

QWORD演算(64Bit演算)

Vistaが発売されれば、int型が64bitになってしまうかもしれませんが。
現状は、int型は32bit(DWORD)なので64bit(QWORD)の整数演算は素直にできません。
で、なんとなく作ってみました。足し算と引き算だけですが。
多分、あってるとおもいます。

Windowsに付属の電卓は64bitで演算できますけどね・・・。

では、サンプルです。
//64bitの足し算
//引数
// hi1 : 足される数の上位DWORD
// low1 : 足される数の下位DWORD
// hi2 : 足す数の上位DWORD
// low2 : 足す数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
bool AdditionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
DWORD low,hi;
DWORD low_t;

if(hi_a == NULL || low_a == NULL){
return false;
}


//下位DWORDの計算
if(((low1 >> 1) + (low2 >> 1)) < 0x80000000){ //下位DWORDのオーバーフローチェック
low = low1 + low2;
}else{
//オーバーフロー
low = (low1 & 0x0fffffff) + (low2 & 0x0fffffff); //最上位の桁を除いて加算
low_t = ((low1 & 0xf0000000) >> 8) + ((low2 & 0xf0000000) >> 8); //最上位の桁だけをいったん右へシフトして加算
low_t <<= 8;
low += low_t;

hi1++; //繰り上がり
}


//上位DWORDの計算
if(((hi1 >> 1) + (hi2 >> 1)) < 0x80000000){ //上位DWORDのオーバーフローチェック
hi = hi1 + hi2;
}else{
//オーバーフロー
*hi_a = 0;
*low_a = 0;
return false;
}

//結果の代入
*hi_a = hi;
*low_a = low;

return true;
}


//64bitの引き算
//引数
// hi1 : 引かれる数の上位DWORD
// low1 : 引かれる数の下位DWORD
// hi2 : 引く数の上位DWORD
// low2 : 引く数の下位DWORD
// hi_a : 答えの上位DWORD
// low_a : 答えの下位DWORD
//num1 >= num2であること
bool SubtractionQWORD(DWORD hi1,DWORD low1,DWORD hi2,DWORD low2,DWORD *hi_a,DWORD *low_a)
{
DWORD low,hi;

if(hi_a == NULL || low_a == NULL){
return false;
}
if(hi1 < hi2 || (hi1 == hi2 && low1 < low2)){
*hi_a = 0;
*low_a = 0;
return false;
}

//下位DWORDの計算
if(low1 >= low2){
//引かれる数が大きければ単純に引く
low = low1 - low2;
hi = hi1;
}else{
//引かれる数が小さい場合は、逆に引く
low = low2 - low1;
low = 0xffffffff - low;
low++; //これ重要
hi = hi1 - 1; //繰り下がり
}

//上位DWORDの計算
hi = hi - hi2;

//結果の代入
*hi_a = hi;
*low_a = low;

return true;
}

<Category : C/C++>

検索

Google

サイドフィード

track feed 理ろぐ
人気ブログランキング - 理ろぐ
Powered by
Movable Type 3.34