2017-06-17 50 views
-2

如果我有这样的C++检查位等于什么

int A = 0x00203450; 

我将如何检查,如果3的值设置一个变量? 所以我检查,如果3就在这里

0x0020 -> 3 <- 450 

我已经试过这

if((A & 0x00003000) == 0x00003000) 
{ 
    _sys_print("the 3 value is set") 
} 

和一些其他的事情,似乎没有任何工作。有什么建议么?

+0

看起来像[XY问题](https://meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。 – Stargateur

+0

您可以举一些例子来说明测试返回true的值以及其他测试返回false的值吗?其实我认为你的'(A&...)'方法应该可行。 –

+1

@StephanLechner'0xFFFF'返回true,但应该没有'3' – Stargateur

回答

2

的问题是,在一个十六进制表示的位置像单个F或者单3表示的4位(或在您的字的“半字节”)一个半字节。如果我理解你是正确的,那么你想检查完整的“半字节”究竟是3,即0011b。然后,表达式A & 0x00003000的问题在于它将“切掉”感兴趣的半字节的前两位,使得在该位置处的输入可能是1111b1011b0111b0011bA & 000003000总会给出0011在这个位置。

所以你应该写(A & 0x0000F000) == 0x00003000),这样你实际上测试了完整的半字节而不仅仅是它的最低两位。请参阅下面的代码来演示此方法。希望能帮助到你。

int main() { 

    int test[] = { 0x00203450, 0x00202450, 0x00207450, 0x0020F450, 0x00200450, 0 }; 

    for (int* t=test; *t; t++) { 
     const char* result = ((*t & 0x0000F000) == 0x00003000) ? "true" : "false"; 
     printf("%08X contains the 3: %s\n", *t, result); 
    } 
    return 0; 
} 
1

我运行你的代码,它适用于我。

#include <stdio.h> 

int main(void) 
{ 
    int A = 0x00203450; 

    if((A & 0x00003000) == 0x00003000) 
     puts("3 is there"); 

    return 0; 
} 

打印3表示存在。你确定_sys_print()函数吗?

编辑:尝试

if((A & 0x0000F000) == 0x00003000) 

这将让为0x0000 <任何一个在这里有> 000,看看它是否是一个3

0

一个整数int是一个整数变量。当您使用0x00203450进行初始化时,最终表示形式不会采用此格式,而是采用二进制0b1000000011010001010000‬。这就是为什么二元运算符存在操纵变量的位。

这就是说,你想知道你的号码是否有数字3。为此,你必须处理您的变量为十六进制:

你可以做这样的事情:

#include <iostream> 

int main(void) { 
    int n = 0x00203450; 
    if (n/16/16/16 % 16 == 3) { 
     std::cout << "There is a 3\n"; 
    } 
} 

一个玉米粥更快的解决方案:

#include <iostream> 

int main(void) { 
    int n = 0x00203450; 
    if ((n & 0xF000) == 0x3000) { 
     std::cout << "There is a 3\n"; 
    } 
} 

与二进制运算的技巧只为基数工作2的倍数,如(4,8和16)。

举例八:

#include <iostream> 

int main(void) { 
    int n = 0342; 
    if ((n & 0700) == 0300) { 
     std::cout << "There is a 3\n"; 
    } 
} 
+0

请问您可以澄清一下:“您无法操作二进制格式并尝试查找十六进制数字而无需在之前将其转换为十六进制数字”? –

+0

int是一个整数,您不能将整数转换为二进制或任何其他表示,因为整数更抽象,然后表示本身。你可以做的是处理二进制表示,但你不需要转换任何东西来做到这一点。 – Logman

3

如果我正确理解你的问题,这是所有你需要:

if((A & 0x0000F000) == 0x00003000) 
{ 
    _sys_print("the 3 value is set") 
} 
+0

感谢您的回答!完美运作 – reflexdev

2

基础上进一步澄清评论的答案似乎是:

(a & 0x0000F000) == 0x00003000 

选择出第四个最低有效十六进制数字并检查它是否为'3'。 因此,在二进制文件中单独看一下它会匹配'0011',但不匹配'0111'。

这是一个小测试用具。

#include <stdio.h> 
#include <stdbool.h> 

bool isThree(int a){ 
    return (a & 0x0000F000) == 0x00003000; 
} 

int check(int a,bool expect){ 
    if(isThree(a)==expect){ 
     return 0; 
    } 
    printf("ERROR: isThree(%x)!=%c\n",a,(expect?'T':'F')); 
    return 1; 
} 

int main(void) 
{ 
    int errors=0; 
    errors+=check(0x00003000,true); 
    errors+=check(0x00004000,false); 
    errors+=check(0x0000F000,false); 
    errors+=check(0x00000000,false); 
    errors+=check(0xABCD3123,true); 
    errors+=check(0xABCD7123,false); 

    if(errors!=0){ 
     printf("ERRORS: %d\n",errors); 
    }else{ 
     printf("Success\n"); 
    } 
    return 0; 
}