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

本文介绍了一个使用对话框作为主界面的多线程计数程序。程序包含计数按钮和暂停/恢复按钮,通过位运算符实现计数、暂停及停止等功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

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

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

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

 

主要程序代码:

int dwOption;    //标志位、0x00000000

int F_PAUSE=1;   //暂停、0x00000001
int F_STOP=2;    //停止、0x00000010
int 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;
}

 

 

 

 

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值