uj5u.com熱心網友回復:
for exampleint main(int argc, const char * argv[]) {
int x, p, n;
scanf("%d", &x);
scanf("%d%d", &p, &n);
int v1 = (x>>(32-p-1)) << (32-p-1); //p的左半部 (右移再左移,把p的右半部清0)
int v2 = (1<<n); //n的右半部
v2 = x % v2; //這里用取余法簡化(也可以移位)
int v3 = 0; //p-n部分
for (int i=0; i<=p-n; i++) { //取出p到n的位的數并取反
v3 = ((~((x>>(p-i)) & 0x00000001)) & 0x00000001) << (p-i) | v3;
}
printf("%d\n", v1|v3|v2);
return 0;
}
uj5u.com熱心網友回復:
如果只要求用一個運算式表示出來呢
uj5u.com熱心網友回復:
那你就把v1,v2,v3合起來寫,之所以分開寫想象讓你清楚邏輯int v = (x/(1<<(p+1))) | (x%(1<<n)) | ~(x%(1<<(p+1)) - x%(1<<n));
printf(“%d\n”, v);
uj5u.com熱心網友回復:
改一下int v = (x-(x%(1<<(p+1)))) | (x%(1<<n)) | ~(x%(1<<(p+1)) - x%(1<<n));
uj5u.com熱心網友回復:
減法可以用&減數的反int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | ~(x%(1<<(p+1)) & ~(x%(1<<n)))
uj5u.com熱心網友回復:
可是,好像不符合題意
uj5u.com熱心網友回復:
忽略了中間部分取反的時候變負數了,要修正回來
int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | (~(x%(1<<(p+1)) & ~(x%(1<<n))) & (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p));
或者中間變數
int m = (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p);
int v = (x & ~(x%(1<<(p+1)))) | (x%(1<<n)) | (~(x%(1<<(p+1)) & ~(x%(1<<n))) & m);
uj5u.com熱心網友回復:
這樣更方便int m = (0x7FFFFFFF<<n) & (0x7FFFFFFF>>p); //p-n的部分都是1,其余都是0
int v = ~(x & m) & (x | m);
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/122263.html
標籤:C語言
上一篇:求助!!
下一篇:請高手講究一下這段代碼
