位运算符(按位与&、按位或|、按位异或^、按位取反~)在程序的多个判定中起的作用

    技术2022-05-20  35

    先看一个多线程程序:(罗云彬Win32中的一个多线程程序)

    用对话框做主界面,对话框中放置“计数”按钮和“暂停/恢复”按钮,并有一个编辑框用来显示计数结果。

    开始计数之前,“暂停/恢复”按钮处于灰化状态,当开始计数后,该按钮被激活,用户按动一次这个按钮,则计数暂停,再一次按动,则继续计数。

    开始计数后,“计数”按钮上的文字将被改为“停止计数”,如果按下“停止计数”按钮,程序将恢复初始状态——第一个按钮变回“计数”按钮,同时灰化“暂停/恢复”按钮。

     

    主要程序代码:

    int dwOption;    //标志位、0x00000000

    int F_PAUSE=1;   //暂停、0x00000001int F_STOP=2;    //停止、0x00000010int F_COUNTING=4;//计数、0x00000100

     

     

    DWORD WINAPI Counter(LPVOID pParam){ dwOption|=F_COUNTING;                       //计数开始,按位与得0x00000100; dwOption&=~(F_STOP|F_PAUSE);            //排除其他两个标志位的干扰,

     SetDlgItemText(_hDlg,IDC_COUNTER,"停止计数"); EnableWindow(hPause,TRUE);                 //激活暂停/恢复按钮    while(!(dwOption&F_STOP)){                 //按位与判断"停止"间是否按下,按下(0x00000010)则跳出计数循环(逻辑运算!2为0)   if(!(dwOption&F_PAUSE)){                   //同理,判断“停止”是否按下,不需灰化按钮,则不需跳出循环  counter++;  sprintf(str,"%d",counter);  SetDlgItemText(_hDlg,IDC_STATIC2,str);   }  }   SetDlgItemText(_hDlg,IDC_COUNTER,"计数");   EnableWindow(hPause,FALSE);            //灰化暂停/恢复按钮   dwOption&=~(F_COUNTING|F_STOP|F_PAUSE);  //按位取反(0x00000111)后(0x11111000)在按位与,

                                                                          //即将标志为dwOption全部置零后退出循环  return 0;                                                        

    }

     

     

     

     

    int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,LPSTR lpszCmdLine,int nCmdShow){ DialogBoxParam(hInstance,(LPCSTR)IDM_DLG,NULL,(DLGPROC)DialogProc,NULL); ExitProcess(NULL);}

     

    LRESULT CALLBACK DialogProc(HWND hDlg,UINT message,WPARAM wParam,LPARAM lParam){ LPDWORD dwTemp; switch(message) { case WM_CLOSE:  EndDialog(hDlg,NULL);  break;

     case WM_INITDIALOG:  hPause=GetDlgItem(hDlg,IDC_PAUSE);  hCounter=GetDlgItem(hDlg,IDC_COUNTER);  hStatic=GetDlgItem(hDlg,IDC_STATIC2);  EnableWindow(hPause,FALSE);  SetDlgItemText(hDlg,IDC_STATIC2,"0");  break;

     

     case WM_COMMAND:  switch(wParam){  case IDC_COUNTER:   _hDlg=hDlg;

     

       if(dwOption&F_COUNTING){ //做按位与运算,程序状态是否在计数状态    dwOption|=F_STOP;       //若在,按位与(0x00000100|0x00000010)计入停止状态(0x00000110)   }   else{                    //否则,不再计数状态,则开始计数线程     h_Thread=CreateThread(NULL,0,Counter,NULL,NULL,&dwThreadID);//创建线程,其中线程函数为Counter    if(!h_Thread){     MessageBox(hDlg,"创建新的线程失败",NULL,MB_OK);     CloseHandle(h_Thread);    }   break;  case IDC_PAUSE:   dwOption^=F_PAUSE; //按位异或:两个相应位相同,则结果为0,否则为1;作用,根据每次点击,

                           //设置F_PAUSE位的取反,对应线程函数中的if(!(dwOption&F_PAUSE))语句;   break;  }   } return 0;}

     

     

     

     

    总结,位运算符可以很好的根据标志位来判断程序的执行流程,且结构分明。


    最新回复(0)