C++定义问题

shulei521 2011-12-05 04:09:07

原始定义为:
#define SETFIRSTIN(x) (x |= 0x08)
#define SETSECONDIN(x) (x |= 0x04)
#define SETFIRSTOUT(x) (x |= 0x02)
#define SETSECONDOUT(x) (x |= 0x01)

#define RESETFIRSTIN(x) (x &= 0xF7)
#define RESETSECONDIN(x) (x &= 0xFB)
#define RESETFIRSTOUT(x) (x &= 0xFD)
#define RESETSECONDOUT(x) (x &= 0xFE)

#define ISFIRSTIN(x) (x & 0x08)
#define ISSECONDIN(x) (x & 0x04)
#define ISFIRSTOUT(x) (x & 0x02)
#define ISSECONDOUT(x) (x & 0x01)


我想把设置扩展为4进4出

修改如下: 但是错误了

#define SETFIRSTIN(x) (x |= 0x0E)
#define SETSECONDIN(x) (x |= 0x0C)
#define SETTHREEIN(x) (x |= 0x0A)
#define SETFOURIN(x) (x |= 0x08)
#define SETFIRSTOUT(x) (x |= 0x06)
#define SETSECONDOUT(x) (x |= 0x04)
#define SETTHREEOUT(x) (x |= 0x02)
#define SETFOUROUT(x) (x |= 0x01)

#define RESETFIRSTIN(x) (x &= 0xF1)
#define RESETSECONDIN(x) (x &= 0xF3)
#define RESETTHREEIN(x) (x &= 0xF5)
#define RESETFOURIN(x) (x &= 0xF7)
#define RESETFIRSTOUT(x) (x &= 0xF9)
#define RESETSECONDOUT(x) (x &= 0xFB)
#define RESETTHREEOUT(x) (x &= 0xFD)
#define RESETFOUROUT(x) (x &= 0xFE)



#define ISFIRSTIN(x) (x & 0x0E)
#define ISSECONDIN(x) (x & 0x0C)
#define ISTHREEIN(x) (x & 0x0A)
#define ISFOURIN(x) (x & 0x08)
#define ISFIRSTOUT(x) (x & 0x06)
#define ISSECONDOUT(x) (x & 0x04)
#define ISTHREEOUT(x) (x & 0x02)
#define ISFOUROUT(x) (x & 0x01)

不知道问题在那 求指导
...全文
132 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
yisikaipu 2011-12-05
  • 打赏
  • 举报
回复
#define SET1IN(x)  (x |= 0x08)
#define SET2IN(x) (x |= 0x04)
#define SET1OUT(x) (x |= 0x02)
#define SET2OUT(x) (x |= 0x01)

#define RESET1IN(x) (x &= 0xF7)
#define RESET2IN(x) (x &= 0xFB)
#define RESET1OUT(x) (x &= 0xFD)
#define RESET2OUT(x) (x &= 0xFE)

#define IS1IN(x) (x & 0x08)
#define IS2IN(x) (x & 0x04)
#define IS1OUT(x) (x & 0x02)
#define IS2OUT(x) (x & 0x01)

// 扩展
#define SET3IN(x) (x|=0x80)
#define SET4IN(x) (x|=0x40)
#define SET3OUT(x) (x|=0x20)
#define SET4OUT(x) (x|=0x10)

#define RESET3IN(x) (x &= 0x7F)
#define RESET4IN(x) (x &= 0xBF)
#define RESET3OUT(x) (x &= 0xDF)
#define RESET4OUT(x) (x &= 0xEF)

#define IS3IN(x) (x & 0x80)
#define IS4IN(x) (x & 0x40)
#define IS3OUT(x) (x & 0x20)
#define IS4OUT(x) (x & 0x10)
shulei521 2011-12-05
  • 打赏
  • 举报
回复
能详细的吗 我是C++菜鸟
vivare 2011-12-05
  • 打赏
  • 举报
回复
0x01, 0x02, 0x04, 0x08, 0x10, 0x20, 0x40, 0x80
一个字节8位,分别对应上面的数字
shulei521 2011-12-05
  • 打赏
  • 举报
回复
必须得这样整,原来的程序 里面 充满了 这种判断 if (ISFIRSTIN(GetDocument()->Edition.IOScreenSign))
所以必须
shulei521 2011-12-05
  • 打赏
  • 举报
回复
求正确答案
iamnobody 2011-12-05
  • 打赏
  • 举报
回复
为什么要扩展成你说的4进4出呢?
而且你“扩展”之后的逻辑不再正确了。还是老老实实用一位表示一个状态吧。

举个例子:
#define SETFIRSTOUT(x) (x |= 0x06)
#define SETSECONDOUT(x) (x |= 0x04)
#define SETTHREEOUT(x) (x |= 0x02)

对于某个状态:
int state = 0;
SETFIRSTOUT(state);
///

然后在后面:
RESETSECONDOUT(state);

你自己算一下结果变成了什么。

变成了THREEOUT这个状态。你从来没有设置过这个状态却无故来了个这个状态,这就是你的“扩展”、

64,651

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧