Cプログラミング言語(第2版)2-7☆


2-7は、xに対して以下の操作を行った結果値を返し、xのp番目のビットからn個(バイナリ)のビットを逆(すなわち、1が0、0が1)にし、xの残りのビットを一定に保つ関数invert(x,p,n)を記述する.
 
#include<stdio.h>

unsigned invert(unsigned x,int p,int n);

int main(){

	unsigned x=5;
	int p=3;
	int n=2;

	unsigned result;
	result = invert(x,p,n);
	printf("%d
",result); return 0; } unsigned invert(unsigned x, int p, int n) { return x ^ (~(~0U << n) << (p-n)); }

 
このプログラムの鍵は、1つの数が1と異なるか、0と異なるか、変わらないかに相当することです.   !!!!
 
私自身のバージョン:(構想が混乱して、まだ問題があります!!)
 
#include<stdio.h>

int invert(unsigned x,int p,int n);

int main(){

	unsigned x=5;
	int p=3;
	int n=2;

	unsigned result;
	result = invert(x,p,n);
	printf("%d
",result); return 0; } int invert(unsigned x,int p,int n) { int leftn;// P n , p-n int rightp;// p leftn = x & ~(~0<<p-n);// p-n , 0 rightp = x & (~0<<p);// p , 0 unsigned tmp= leftn | rightp; // p n 0, unsigned tmp1; tmp1 = (x>>p-n) & ~(~0<<n); // n , unsigned tmp2; tmp2 = ~tmp1; unsigned tmp3; tmp3 = tmp2 & ~(~0<n); unsigned result; result = tmp | tmp3; return result; }