負の割り算とシフト演算との関係

intを使用して正の数を2のべき乗で割る場合、シフト演算で代用できます。

ただし、負の数の割り算の場合はそうではありません。

以下はCで記述した負の割り算とシフト演算の例です。シフト演算でも最上位bitが符号bitで補間されているため、符号が変わることはありません。

ただし、割り切れない部分がシフト演算だと切り捨て処理になっていますが、割り算だと切り上げ処理になっています。

これは知っていないと少し詰まる箇所だと思います。


#include <stdio.h>

void calc(int i, int sft);

int main()
{
int i;
int sft;

i = 0xfffffffe; sft = 1; calc(i, sft);
i = 0xffffffff; sft = 1; calc(i, sft);
i = 0xfffffff8; sft = 3; calc(i, sft);
i = 0xfffffff9; sft = 3; calc(i, sft);
i = 0xffffffff; sft = 3; calc(i, sft);

return 0;
}

void calc(int i, int sft)
{
printf("=========================\n");
printf("integer division %d/%d=%d\n", i, (1<<sft), i/(1<<sft));
printf("integer division 0x%x/0x%x=0x%x\n", i, (1<<sft), i/(1<<sft));
printf("integer shift %d>>%d=%d\n", i, sft, i>>sft);
printf("integer shift 0x%x>>0x%x=0x%x\n", i, sft, i>>sft);
}



■ 結果
=========================
integer division -2/2=-1
integer division 0xfffffffe/0x2=0xffffffff
integer shift -2>>1=-1
integer shift 0xfffffffe>>0x1=0xffffffff
=========================
integer division -1/2=0
integer division 0xffffffff/0x2=0x0
integer shift -1>>1=-1
integer shift 0xffffffff>>0x1=0xffffffff
=========================
integer division -8/8=-1
integer division 0xfffffff8/0x8=0xffffffff
integer shift -8>>3=-1
integer shift 0xfffffff8>>0x3=0xffffffff
=========================
integer division -7/8=0
integer division 0xfffffff9/0x8=0x0
integer shift -7>>3=-1
integer shift 0xfffffff9>>0x3=0xffffffff
=========================
integer division -1/8=0
integer division 0xffffffff/0x8=0x0
integer shift -1>>3=-1
integer shift 0xffffffff>>0x3=0xffffffff

テーマ : プログラミング
ジャンル : コンピュータ

2007-07-27 : Work-Linux-C/C++/Java : コメント : 0 : トラックバック : 0
Pagetop
コメントの投稿
非公開コメント

Pagetop
« next  ホーム  prev »

プロフィール

zive

Author:zive
大阪在住、男

ブログ検索

月別アーカイブ

FC2カウンター