如果我有这样的变量
int A = 0x00203450;
如何检查3值是否已设定? 所以我正在检查3是否就在这里
0x0020 -> 3 <- 450
我试过这个
if((A & 0x00003000) == 0x00003000)
{
_sys_print("the 3 value is set")
}
还有一些其他的东西,似乎都没有用。有什么建议吗?
答案 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
的问题在于它将“切掉”感兴趣的半字节的前两位,这样该位置的输入可以是1111b
或1011b
,或0111b
,或0011b
,A & 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>