実際の処理はこんな感じかと思います。
#include <stdio.h>
int nishin(int h[],int size,int a)
{
/*二進数の形に変換*/
for(int i=0;i<size;i++){
h[i]=a%2;
a=a/2;
}
return 0;
}
int main(void)
{
int x[16],y[16],a,b,i,j,m,n,p,w,z;
unsigned int size_8=8,size_16=16;
puts("二つの符号なし整数を入力してください。(ただしa>bとし、bは2のべき乗の値とする)");
do{
printf("a=");scanf("%d",&a);
printf("b=");scanf("%d",&b);
printf("\n");
if (!(a&&b)) return 0;
for(i=0x80,j=0;i;i>>=1) j+=b&i?1:0;
}while(a<=b||(a|b)>0x100||a<0||b<0||j-1);
// 入力条件を満たせば続きます
puts("aとbをそれぞれ二進数で表すと");
printf("a=");
nishin(x,size_8,a);
for(i=size_8-1;i>=0;i--){
printf("%d",x[i]);
}
puts("");
printf("b=");
nishin(y,size_8,b);
for(i=size_8-1;i>=0;i--){
printf("%d",y[i]);
}
printf("\r\n");
for(j=0,m=a,n=b;j<8;j++,n>>=1) m=n&1?m<<j:m;
printf("a*b=");//掛け算
nishin(x,size_16,m);
for(i=size_16-1;i>=0;i--){
printf("%d",x[i]);
}
printf("\r\n");
for(j=0,p=m=a,n=b,z=0,w=0;j<8;j++,n>>=1,p>>=1)
{
m=n&1?m>>j:m;
if (!(n&1) && !w) z|=(p&1)<<j,w=n>>1&1;
}
printf("a/b=");//割り算
nishin(x,size_16,m);
for(i=size_16-1;i>=0;i--){
printf("%d",x[i]);
}
printf("\r\n");
printf("a mod b=");//余り
nishin(y,size_16,z);
for(i=size_16-1;i>=0;i--){
printf("%d",y[i]);
}
printf("\r\n");
printf("\r\nとなります。\n\n");
return(0);
}
お礼
回答ありがとうございます!私はビットシフトのことが完全に把握できていなかったので混乱してしまっていたんです。 なので、アドバイス通りにまずは乗算からじっくり理解したいと思います。