C ++检查位是否等于某事

时间:2017-06-17 20:22:12

标签: c++ if-statement memory char bit

如果我有这样的变量

int A = 0x00203450;

如何检查3值是否已设定? 所以我正在检查3是否就在这里

0x0020 -> 3 <- 450

我试过这个

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

还有一些其他的东西,似乎都没有用。有什么建议吗?

5 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分:2)

根据评论中的进一步澄清,答案似乎是:

#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;
}

选择第四个最低有效十六进制数字并检查它是否为&#39; 3&#39;。 所以单独用二进制看这个半字节就会匹配“#0011; 0011&#39;但不匹配&#39; 0111&#39;。

这是一个小小的测试工具。

  Calendar calendar = null;
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        calendar = getInstance();
        calendar.set(HOUR_OF_DAY,hour);
        calendar.set(MINUTE,min);
    }else{
        date = new Date();
        date.setHours(hour);
        date.setMinutes(min);
    }

    Intent intent = new Intent(getApplicationContext(),Notification_reciever.class);

    PendingIntent pendingIntent = PendingIntent.getBroadcast(getApplicationContext(),uniquecode,intent,PendingIntent.FLAG_UPDATE_CURRENT);
    AlarmManager alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,calendar.getTimeInMillis(),AlarmManager.INTERVAL_DAY,pendingIntent);
    }else{
        alarmManager.setRepeating(AlarmManager.RTC_WAKEUP,date.getTime() ,AlarmManager.INTERVAL_DAY,pendingIntent);
    }
}

答案 2 :(得分:2)

问题在于,像单个F或单个3的十六进制表示中的位置表示4位的半字节(或者单词中的“半字节”)。如果我理解你的话,那么你想检查完整的“半字节”是否正好3,即0011b。那么表达式A & 0x00003000的问题在于它将“切掉”感兴趣的半字节的前两位,这样该位置的输入可以是1111b1011b,或0111b,或0011bA & 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;
}

答案 3 :(得分: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&lt;无论A在这里有多少&000;并且看看它是否为3。

答案 4 :(得分:0)

整数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";
    }
}

更快的解决方案:

#include <iostream>

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

二元运算符的技巧仅适用于2的基数倍,如(4,8和16)。

八进制示例:

<html>
<head>
    <meta charset="utf-8"/>
    <title>Chart.js demo</title>
    <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/0.2.0/Chart.min.js" type="text/javascript"></script>

</head>
<body>


    <h1>Chart.js Sample</h1>

    <canvas id="myChart" width="600" height="400"></canvas>
        <script>
        var ctx = document.getElementById('myChart').getContext('2d');
        var chart = new Chart(ctx, {
      // The type of chart we want to create
      type: 'line',

      // The data for our dataset
      data: {
          labels: ["January", "February", "March", "April", "May", "June", "July"],
          datasets: [{
              label: "My First dataset",
              backgroundColor: 'rgb(255, 99, 132)',
              borderColor: 'rgb(255, 99, 132)',
              data: [0, 10, 5, 2, 20, 30, 45],
          }]
      },

      // Configuration options go here
      options: {}
  });
    </script>
</body>
</html>