[問2]プログラム例 4.1 と同様の処理を double 型,及び,char 型変数に対して行うプログラムを書け.
/******************************************/
/* ポインタを使用した2つのデータの和 */
/* coded by Y.Suganuma */
/******************************************/
#include <stdio.h>
int main()
{
double a = 10.0, b = 20.0;
double *ap, *bp;
char ac = 'a', bc = 'b';
char *apc, *bpc;
/*
double
*/
/* アドレスの設定 */
ap = &a;
bp = &b;
/* アドレスと計算結果の出力 */
printf("和は=%f アドレス(a=%08x b=%08x)\n", *ap+*bp, ap, bp);
a++;
bp++;
printf(" アドレス(a=%08x b=%08x)\n", ap, bp);
printf("bpの指す場所(a)に記憶されている値は=%f\n", *bp);
/*
char
*/
/* アドレスの設定 */
apc = ∾
bpc = &bc;
/* アドレスと計算結果の出力 */
printf("和は=%d アドレス(ac=%08x bc=%08x)\n", *apc+*bpc, apc, bpc);
ac++;
bpc++;
printf(" アドレス(ac=%08x bc=%08x)\n", apc, bpc);
printf("bpcの指す場所(ac)に記憶されている値は=%c\n", *bpc);
return 0;
}
[問3]次の演算結果がどのようになるかを見るための適当なプログラムを書き,その実行結果から演算結果について説明せよ.
(1)*(point++)
(2)**point
/********************************/
/* ポインタ */
/* coded by Y.Suganuma */
/********************************/
#include <stdio.h>
int main(void)
{
int b = 10, a = 20;
int *point, *pointp;
point = &a; /* aのアドレス */
/*
*(point++)
*/
printf("point %08x その指す値 %d\n", point, *point);
pointp = point;
pointp++;
printf("point++ %08x その指す値 %d\n", pointp, *pointp);
/*
**point
次の文はエラーになる.**pointは,(*point)が指すアドレスに入っている
値を示すが,(*point)はアドレスではない.
printf("point %08x *point %d **point %08x\n", point, *point, **point);
*/
return 0;
}
[問4]整数データの上位 4 ビットと下位 4 ビットを,それぞれ 2 進数 4 ビットの正の整数とみなし,それらを加えて結果を出力するプログラムを書け.
/********************************/
/* 上位及び下位4ビットの和 */
/* coded by Y.Suganuma */
/********************************/
#include <stdio.h>
int main()
{
int n, low, up;
unsigned int un;
/*
整数データの入力
*/
printf("整数を入力して下さい ");
scanf("%d", &n);
printf(" 入力された整数は %08x\n", n);
/*
上位及び下位4ビットの和
*/
low = n & 0x0000000f;
un = (unsigned int)n;
up = (int)(un >> (8 * sizeof(int) - 4));
printf("low %d up %d 和 %d\n", low, up, low+up);
return 0;
}
+++ Javaの場合 +++
/********************************/
/* 上位及び下位4ビットの和 */
/* coded by Y.Suganuma */
/********************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n, low, up;
/*
整数データの入力
*/
System.out.print("整数を入力して下さい ");
n = Integer.parseInt(in.readLine());
System.out.println(" 入力された整数は " + Integer.toHexString(n));
/*
上位及び下位4ビットの和
*/
low = n & 0x0000000f;
up = n >>> 28; // Java固有の演算子
System.out.println("low " + low + " up " + up + " 和 " + (low+up));
}
}
[問5]すべてのビットを反転した後,最上位ビットに 1 をセットするプログラムを,排他的論理和と論理和を使用して書け.
/********************************/
/* ビットの反転 */
/* coded by Y.Suganuma */
/********************************/
#include <stdio.h>
int main()
{
int n, m;
/*
整数データの入力
*/
printf("整数を入力して下さい ");
scanf("%d", &n);
printf(" 入力された整数は %08x\n", n);
/*
ビットの反転と最上位ビットに1をセット
*/
m = n ^ 0xffffffff;
m = m | 0x80000000;
printf("結果 %08x\n", m);
return 0;
}
+++ Javaの場合 +++
/********************************/
/* ビットの反転 */
/* coded by Y.Suganuma */
/********************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n, m;
/*
整数データの入力
*/
System.out.print("整数を入力して下さい ");
n = Integer.parseInt(in.readLine());
System.out.println(" 入力された整数は " + Integer.toHexString(n));
/*
ビットの反転と最上位ビットに1をセット
*/
m = n ^ 0xffffffff;
m = m | 0x80000000;
System.out.println("結果 " + Integer.toHexString(m));
}
}
[問6]整数データを 9 倍する演算を,ビットシフトと加算を利用して行うプログラムを書け.
/********************************/
/* 整数データを9倍 */
/* coded by Y.Suganuma */
/********************************/
#include <stdio.h>
int main()
{
int n, m;
/*
整数データの入力
*/
printf("整数を入力して下さい ");
scanf("%d", &n);
/*
9倍
*/
m = n << 3;;
m += n;
printf("結果 %d\n", m);
return 0;
}
+++ Javaの場合 +++
/********************************/
/* 整数データを9倍 */
/* coded by Y.Suganuma */
/********************************/
import java.io.*;
public class Test {
public static void main(String args[]) throws IOException
{
BufferedReader in = new BufferedReader(new InputStreamReader(System.in));
int n, m;
/*
整数データの入力
*/
System.out.print("整数を入力して下さい ");
n = Integer.parseInt(in.readLine());
/*
9倍
*/
m = n << 3;;
m += n;
System.out.println("結果 " + m);
}
}