gpt4 book ai didi

c - 使用位掩码提取十六进制的二进制表示会导致错误

转载 作者:行者123 更新时间:2023-11-30 15:17:08 26 4
gpt4 key购买 nike

所以我编写了这个函数,create_room_connections(struct *, unsigned int),它接受一个指向结构的指针和一个无符号整数作为输入。

现在,那个 unsigned int 实际上是一个十六进制数,这个函数的目的是用位掩码来掩盖十六进制数,从而推导出它的十进制表示形式。

这是我的功能:

void create_room_connections(struct maze_room *room, unsigned int hex) {
unsigned int emask=8;
unsigned int wmask=4;
unsigned int smask=2;
unsigned int nmask=1;
room->visited=0; // set visted to false
// printf("HEXXXXX=%d\n",hex);
// printf("hex&emask=%d\n",hex&emask);
// printf("hex&wmask=%d\n",hex&wmask);
// printf("hex&smask=%d\n",hex&smask);
// printf("hex&nmask=%d\n",hex&nmask);
// printf("emask=%d\n",emask);
// printf("wmask=%d\n",wmask);
// printf("smask=%d\n",smask);
// printf("nmask=%d\n",nmask);


if(hex&emask == emask) { //set econn to 1
room->econn=1;
printf("emask true!,so econn=%d\n",room->econn);
}
else {
room->econn=0;
printf("emask false!,so econn=%d\n",room->econn);
}

if(hex&wmask == wmask) { //set wconn to 1
room->wconn=1;
printf("wmask true!, so wconn=%d\n", room->wconn);
}
else {
room->wconn=0;
printf("wmask false!,so wconn=%d\n",room->wconn);
}

if(hex&smask == smask) { //set sconn to 1
room->sconn=1;
printf("smask true!,so sconn=%d\n",room->sconn);
}
else {
room->sconn=0;
printf("smask false!,so sconn=%d\n",room->sconn);
}

if(hex&nmask == nmask) { //set nconn to 1
room->nconn=1;
printf("nmask true!,so nconn=%d\n",room->nconn);
}
else {
room->nconn=0;
printf("nmask false!,so nconn=%d\n",room->nconn);
}

// printf("econn, wconn, sconn, nconn=%d %d %d %d\n",room->econn, room->wconn, room->sconn, room->nconn);
}

这是结构:

struct maze_room {
int row;
int col;
int visited; //0 for false, 1 for true,
int econn; // 1 for wall and 0 for opening
int wconn;
int nconn;
int sconn;
};

我的思路是这样的:

我创建了四个位掩码,

unsigned int emask=8;  //to find out the first bit (most significant) corresponds to econn
unsigned int wmask=4; //to find out the second bit,corresponds to wconn
unsigned int smask=2; //to find out the third bit, corresponds to sconn
unsigned int nmask=1; //to find out the last bit (least significant) corresponds to nconn

我在函数中使用了以下逻辑 4 次(每个位一次):

if(hex&emask == emask)      // hex is the unsigned int passsed as input. if it has a 1 as its first bit, the if would evaluate to true, and then I set the econn to 1
room->econn=1; // econn is an int member of the structure.

最后,当我打印出这些值时,

room->econn , room->wconn, room->sconn, room->nconn   //4 members of the structure.

我希望它们与十六进制的二进制表示相对应。

例如,如果 hex=13 我期望 (room->econn,room->wconn,room->sconn,room->nconn)=(1101) (二进制表示共 13 条)

但是输出完全令人沮丧。

如果我通过 hex=11,我会得到 1111hex=3 给出 1111hex=10 给出 0000。 (忽略 if 和 else block 内 printfs 的输出)基本上,在某些情况下,所有 if 要么为 true,要么全部为 false。

我做错了什么?

编辑:调用代码位于循环内,如下所示

    create_room_connections(&maze[get_index(i, j, num_cols)], conn);

这里conn是传递的unsigned int,第一个参数(完成评估后)是指向结构的指针。在主函数中,maze是一维结构数组,get_index是将2d数组映射到一维迷宫的函数

最佳答案

如果您查看二元运算符的优先级,如下所示:< swansontec.com/sopc.html >;您会注意到“==”运算符的优先级高于“&”运算符,因此首先评估“==”。 – 用户3629249

关于c - 使用位掩码提取十六进制的二进制表示会导致错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32670633/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com