Cプログラミング言語(第2版)2-7☆
2-7は、xに対して以下の操作を行った結果値を返し、xのp番目のビットからn個(バイナリ)のビットを逆(すなわち、1が0、0が1)にし、xの残りのビットを一定に保つ関数invert(x,p,n)を記述する.
このプログラムの鍵は、1つの数が1と異なるか、0と異なるか、変わらないかに相当することです. !!!!
私自身のバージョン:(構想が混乱して、まだ問題があります!!)
#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;
}