回 帖 发 新 帖 刷新版面

主题:恳请vrace兄指教:关于记事本程序中进行“查找”/“替换”代码的疑问

小弟不明白在if条件中,为什么要用 & 而不用 ==

以下是一个记事本程序中的一段代码:
......
......
LPFINDREPLACE    pfr ;
static UINT      messageFindReplace ;
......
messageFindReplace = RegisterWindowMessage (FINDMSGSTRING) ;
......
......
if (message == messageFindReplace)
          {
               pfr = (LPFINDREPLACE) lParam ;
               
               if (pfr->Flags & FR_DIALOGTERM) //判断查找或替换对话框正在关闭
                    hDlgModeless = NULL ;//将非模态对话框句柄设成NULL
               
               if (pfr->Flags & FR_FINDNEXT)
               //判断“查找”对话框中选中的项是否“查找”/“查找下一个”
                    if (!PopFindFindText (hwndEdit, &iOffset, pfr))//进行查找
                         OkMessage (hwnd, TEXT ("Text not found!"),
                                          TEXT ("\0")) ;
                    
               if (pfr->Flags & FR_REPLACE || pfr->Flags & FR_REPLACEALL)
               //判断“替换”对话框中选中的项是否“替换”/“替换全部”
                    if (!PopFindReplaceText (hwndEdit, &iOffset, pfr))//进行替换
                         OkMessage (hwnd, TEXT ("Text not found!"),
                                          TEXT ("\0")) ;
                         
               if (pfr->Flags & FR_REPLACEALL)
               //判断“替换”对话框中选中的项是否“替换全部”
                    while (PopFindReplaceText (hwndEdit, &iOffset, pfr)) ;//进行替换
                              
               return 0 ;
          }
小弟不明白if条件中,进行判断的为何用& , 而不用== ?
而如果我把全部的&改成==,编译出来的程序根本不能进行查找和替换。
请vrace兄指教,小弟洗耳恭听。

回复列表 (共7个回复)

沙发

if(a & b)
的意思,就是说如果它包含了 b 的值。
在定义值的时候,之所以要定义成
#define AAA 1
#defien BBB 2
#define CCC 4
#define DDD 8
这种形式,就是为了使用 & (and) 操作符判断是否有指定的值。
因为 API 中通常都是传一个 DWORD 表示多种信息。所以要向这样用。

说得有一点乱,见谅。

板凳

BYTE 0000 0000 是假
      1111 1111 是真`
那   0000 1000 是真是假?

如果是真  那么 if(0000 0001 & 0000 0010) 的判断又有什么意义呢?

是不是 楼上的程序中的 flag 值只能为:0000 0000 或 1111 1111 ?

3 楼

vrace兄的意思是,在定义flag时:

#define FR_AAA 0000 0000 0000 0001B
#define FR_BBB 0000 0000 0000 0010B
#define FR_CCC 0000 0000 0000 0100B
#define FR_DDD 0000 0000 0000 1000B
#define FR_EEE 0000 0000 0001 0000B
......
每一个标志只有一个位为1。

而API传递的往往是以DWORD形式,假设传递的Flags是0000 0000 0001 0110
表明它包含了FR_EEE、FR_CCC、FR_BBB,

Flags & FR_EEE
Flags & FR_CCC
Flags & FR_BBB
均为真。


Flags & FR_DDD
Flags & FR_AAA
均为假

我的理解没错吧,请vrace兄指教。

4 楼

实际上就是这样,只有一个标志位为1,其他的为0

5 楼

回2楼,00001000当然为真。请注意,每个 flag 都至少要有一个位为 1,而且,与其他的 flag 不重复,你的 00000000 全部为 0,当然是无法用 & 处理的。

6 楼

好玩的是,在ASM中,真是全为1,假是全为0,其它的就是非真非假了?!

7 楼

你不能这样玩啊?

; eax stored the input DWORD value
mov ecx, eax
and ecx, FLAG_AAA
cmp ecx, 0
jne xxx ; eax included the value
; eax does not include the value

我来回复

您尚未登录,请登录后再回复。点此登录或注册