注:【2】:二进制;【10】:十进制;[16]:十六进制
1.&是按位与,对吗?
2:
1>按位与,我知道在二进制中有,那么16进制中也有吗?
2>如果有:
  ①.那么二进制中的是:如,11【2】&01【2】=01【2】,也就是1【2】;
  ②.那16进制的怎么算,它有不只是0,1呀.
     ㈠.如这两个数15【10】和17【10】所对应的二进是1111【2】和10001【2】,那么1111【2】&10001【2】=1【2】,对吧?
     ㈡.如这两个数15【10】和17【10】所对应的二进是0x000F【16】和0x0011【16】,那么0x000F【16】&0x11【16】等于多少呢,是0x0? 还是和二进制 计算后得的一样呢?-------------------------
3.因为有在写自定义菜单,用到了"dwFlags & MF_POPUP"(对些也不是很懂,有好多地方也用到了这种表达式,找了些资料就出了这么多问题),调试dwFlags是0x0010,而MF_POPUBP是0x00000010L,那这是怎么计算的呢?0x0010 & 0x00000010L在调试窗口中是0x0010,对吗本贴回答满意会加分

解决方案 »

  1.   

    按位与,正确!计算机中都是二进制。其它进制都是为了方便人而设置的。dwFlags & MF_POPUP 就是判断前面那个标志里面是否包含后面的标志。
      

  2.   

    楼上已经说清楚了,楼主所说的情况,一般是用来判断是否存在某个标记,注意,是存在,而不是等于,因为dwFlags可能是多个标记的组合而成的一个数值。
      

  3.   

    如果是包含,那么这些宏,定义的时候是不是就必须符合这样:1,2,4,8,16,64...(十进制)转化成十六进制就是0x0001,0x0002,0x0004,0x0008,0x0010,0x0040...
    要么24【10】也包含16【10】了,即0x0018也包含0x0010了
      

  4.   

    dwFlags是用每个二进制位表示一种含义,在定义标志时,每个标志对应的二进制数中只有一位是1,把多个标志用“或”组合起来使用。24就是8和16的组合。
      

  5.   

    24(d) = 11000(b) = 10000(b) + 1000(b) = 16(d) + 8(d)
      

  6.   

    楼主,你可以去看看,MF_POPUP以及相联系的其他标识符的实际数值,就能发现些什么了#define MF_POPUP            0x00000010L
    #define MF_MENUBARBREAK     0x00000020L
    #define MF_MENUBREAK        0x00000040L//再发一组类似的
    /*
     * Window Styles
     */
    #define WS_OVERLAPPED       0x00000000L
    #define WS_POPUP            0x80000000L
    #define WS_CHILD            0x40000000L
    #define WS_MINIMIZE         0x20000000L
    #define WS_VISIBLE          0x10000000L
    #define WS_DISABLED         0x08000000L
    #define WS_CLIPSIBLINGS     0x04000000L
    #define WS_CLIPCHILDREN     0x02000000L
    #define WS_MAXIMIZE         0x01000000L
    #define WS_CAPTION          0x00C00000L     /* WS_BORDER | WS_DLGFRAME  */
    #define WS_BORDER           0x00800000L
    #define WS_DLGFRAME         0x00400000L
    #define WS_VSCROLL          0x00200000L
    #define WS_HSCROLL          0x00100000L
    #define WS_SYSMENU          0x00080000L
    #define WS_THICKFRAME       0x00040000L
    #define WS_GROUP            0x00020000L
    #define WS_TABSTOP          0x00010000L
      

  7.   

    1.那么24(d)&16(d)=16,是不是结果如果包含16(d),那么就会等于16(d),还是理解为一个非零的数,还是有其它理解?
    2.那个0x00000000L后面的那个"L"是什么意思?
      

  8.   

    "L"我知道了,是个Long型.
    但我发现这个
    #define WS_CAPTION  0x00C00000L     /* WS_BORDER | WS_DLGFRAME  */
    也就是说,0x00C00000L 包含了下面0x00800000和0x00400000呀,怎么回事?
    怎么不是0x01000000
    难道,它本来就是下面两个的组合吗?
      

  9.   

    楼主,你说得没错,
    WS_CAPTION就是WS_BORDER , WS_DLGFRAME得组合,后面有注释的,即 WS_BORDER | WS_DLGFRAME (或运算)
      

  10.   

    1.那么24(d)&16(d)=16,是不是结果如果包含16(d),那么就会等于16(d),还是理解为一个非零的数,还是有其它理解? 
    //结果就是16(d)
    // 24(d) & 16(d) = 16
    //关于位运算,把数值写成2进制形式,就很清楚了。
      

  11.   

    1.那么24(d)&16(d)=16,是不是结果如果包含16(d),那么就会等于16(d),还是理解为一个非零的数,还是有其它理解? 应该是等于才对。看看这个
    #define WS_OVERLAPPED       0x00000000L
    任何数值跟WS_OVERLAPPED进行“与”运算,都是一个零值,而不是一个非零值。
    即,应该这样写
    if (dwFlags & WS_OVERLAPPED == WS_OVERLAPPED)
    {
    }依次类推,当然,如果能确认标记本身为非零值,可以简写为
    if (dwFlags & WS_CAPTION)
    {
    }
      

  12.   

    恩,谢谢提醒,
    #define WS_OVERLAPPED      0x00000000L 
    这个零值,要不以后用就会用错了.