演習問題4解答例

問1 演算子による演算結果
問2 ポインタを使用した 2 つのデータの和
問3 ポインタと演算子
問4 指定されたビットの取り出し
問5 指定されたビットの設定
問6 ビット操作による乗算

[問1]次の演算結果がどのようになるかを見るための適当なプログラムを書き,その実行結果から演算結果について説明せよ.
(1)x = (a == 10)
(2)(c >= 'a') && (c <= 'z')

(1)a が 10 なら真,そうでなければ偽
(2)c が 小文字のアルファベットなら真,そうでなければ偽
/****************************/
/* 論理演算                 */
/*      coded by Y.Suganuma */
/****************************/
#include <stdio.h>

int main()
{
	int a, x1, x2;
	char c;
/*
          x=(a==10) の評価
*/
	a  = 10;
	x1 = (a == 10);
	a  = 5;
	x2 = (a == 10);
	printf("aが10の時,xは %d\n", x1);
	printf("aが5の時,xは %d\n", x2);
/*
          (c >= 'a') && (c <= 'z') の評価
*/
	c  = 'h';
	x1 = (c >= 'a') && (c <= 'z');
	c  = 'H';
	x2 = (c >= 'a') && (c <= 'z');
	printf("cが'h'の時,論理式は %d\n", x1);
	printf("cが'H'の時,論理式は %d\n", x2);

	return 0;
}
		
[問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;
}
		
[問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;
}
		
[問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;
}
		

菅沼ホーム 演習解答例目次 本文目次 付録 索引