2012-09-17 42 views
1

我正在实现一个C函数unsigned invert(unsigned x, int p, int n) ,该函数返回x,并返回位置p开始的n位,并保持其他位不变。C中的反转功能不起作用。按位运算符

#include <stdio.h> 

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

int main() 
{ 
    printf("%u\n", invert(11111111, 5, 4)); 
    printf("%u\n", invert(10, 2, 2)); 

    return 0; 
} 

unsigned invert(unsigned x, int p, int n) 
{ 
    return x^(~(~0<<n)<<p+1-n); 
} 

这是我走到这一步,如果我跟踪功能,通过它应该是对的,但我不断收到11111163第一次测试和12第二次测试。

+0

请解释你的功能背后的逻辑(在这个过程中,你可能会找出你错在哪里) –

+1

是11111111和10应该是二进制的?我敢肯定c不支持二进制文字...尝试这些数字0xFF和0x2。 –

+0

'11111111'是一个十进制整数,不是二进制。你需要传递一个十六进制值并将其转换。像'0xFF'(11111111二进制) –

回答

2

我认为你的程序正在工作。只有你必须做的是用二进制表示数字。

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

int main() 
{ 
    printf("%x\n", invert(0b11111111, 5, 4)); 
    printf("%x\n", invert(0b10, 2, 2)); 

return 0; 

} 

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

{ 
    return x^(~(~0<<n)<<p+1-n); 
} 

这是你想要的吗?

+0

这有帮助,但有没有办法返回二进制数? – ganlaw

+1

一个数字是一个数字。这取决于你如何在屏幕上打印它。 如果你想以二进制格式打印它,你需要类似[this](http://stackoverflow.com/questions/111928/is-there-a-printf-converter-to-print-in-binary-格式) – Raj