VerySource

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1178|回复: 8

急盼:“&”“|=”“^=”这几个位操作符有什么实际意义

[复制链接]

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
发表于 2020-12-16 20:30:02 | 显示全部楼层 |阅读模式
最近在看一份原码,对位操作符理解的不太清楚,请诸位帮忙解释一下“&”“|=”“^=”这几个位操作符有什么实际意义,最好能给出具体应用的例子,先谢了
回复

使用道具 举报

0

主题

37

帖子

28.00

积分

新手上路

Rank: 1

积分
28.00
发表于 2020-12-17 02:30:01 | 显示全部楼层
&是按位与
|=先按位或,然后赋值。
^=先按位异或,然后赋值。
回复

使用道具 举报

0

主题

7

帖子

7.00

积分

新手上路

Rank: 1

积分
7.00
发表于 2020-12-17 08:00:01 | 显示全部楼层
在网络编程中,你和别人的通信中定义一个帧的时候,比如帧头为0xFF,你不用位操作怎么能定为帧头?
回复

使用道具 举报

0

主题

8

帖子

9.00

积分

新手上路

Rank: 1

积分
9.00
发表于 2020-12-17 16:45:01 | 显示全部楼层
&是按位与 1&1==1  0&1==0 1&0==0 0&0==0
|是按位或 1|1==1  0|1==1 1|0==1 0|0==0
^是按位异或 1^1==0  0^1==1 1^0==1 0^0==0
|=先按位或,然后赋值。
^=先按位异或,然后赋值。
回复

使用道具 举报

0

主题

7

帖子

5.00

积分

新手上路

Rank: 1

积分
5.00
发表于 2020-12-18 21:00:01 | 显示全部楼层
如果不知道按位操作有什么用,或者不知道按位操作是什么,可以读一些电子电路或者汇编方面的书,硬件或者通信方面经常要按位操作;
回复

使用道具 举报

1

主题

2

帖子

3.00

积分

新手上路

Rank: 1

积分
3.00
 楼主| 发表于 2020-12-19 19:00:02 | 显示全部楼层
BOOL   CFileView::PreCreateWindow(CREATESTRUCT&   cs)   
  {   
  if   (!CListView::PreCreateWindow   (cs))   
  return   FALSE;   
   
          cs.style   &=   ~LVS_TYPEMASK;   
          cs.style   |=   LVS_REPORT;   
  return   TRUE;   
  }   

有人解释
cs.style   &=   ~LVS_TYPEMASK;//去取窗口或控件风格LVS_TYPEMASK
cs.style   |=   LVS_REPORT; //增加窗口或控件风格LVS_REPORT
这是什么意思,能否帮忙详细解释一下,同时:
bool
HeapTupleSatisfiesItself(HeapTupleHeader tuple, Buffer buffer)
{
        if (!(tuple->t_infomask & HEAP_XMIN_COMMITTED))//tuple->t_infomask与HEAP_XMIN_COMMITTED
        {
                if (tuple->t_infomask & HEAP_XMIN_INVALID)
                        return false;

                if (tuple->t_infomask & HEAP_MOVED_OFF)
                {
                        TransactionId xvac = HeapTupleHeaderGetXvac(tuple);

                        if (TransactionIdIsCurrentTransactionId(xvac))
                                return false;
                        if (!TransactionIdIsInProgress(xvac))
                        {
                                if (TransactionIdDidCommit(xvac))
                                {
                                        tuple->t_infomask |= HEAP_XMIN_INVALID;
                                        SetBufferCommitInfoNeedsSave(buffer);
                                        return false;
                                }
                                tuple->t_infomask |= HEAP_XMIN_COMMITTED;
                                SetBufferCommitInfoNeedsSave(buffer);
                        }
                }
                else if (tuple->t_infomask & HEAP_MOVED_IN)
                {
                        TransactionId xvac = HeapTupleHeaderGetXvac(tuple);

                        if (!TransactionIdIsCurrentTransactionId(xvac))
                        {
                                if (TransactionIdIsInProgress(xvac))
                                        return false;
                                if (TransactionIdDidCommit(xvac))
                                {
                                        tuple->t_infomask |= HEAP_XMIN_COMMITTED;
                                        SetBufferCommitInfoNeedsSave(buffer);
                                }
                                else
                                {
                                        tuple->t_infomask |= HEAP_XMIN_INVALID;
                                        SetBufferCommitInfoNeedsSave(buffer);
                                        return false;
                                }
                        }
                }
                else if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmin(tuple)))
                {
                        if (tuple->t_infomask & HEAP_XMAX_INVALID)        /* xid invalid */
                                return true;

                        /* deleting subtransaction aborted */
                        if (TransactionIdDidAbort(HeapTupleHeaderGetXmax(tuple)))
                        {
                                tuple->t_infomask |= HEAP_XMAX_INVALID;
                                SetBufferCommitInfoNeedsSave(buffer);
                                return true;
                        }

                        Assert(TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmax(tuple)));

                        if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
                                return true;

                        return false;
                }
                else if (!TransactionIdDidCommit(HeapTupleHeaderGetXmin(tuple)))
                {
                        if (TransactionIdDidAbort(HeapTupleHeaderGetXmin(tuple)))
                        {
                                tuple->t_infomask |= HEAP_XMIN_INVALID; //tuple->//
                                SetBufferCommitInfoNeedsSave(buffer);
                        }
                        return false;
                }
                else
                {
                        tuple->t_infomask |= HEAP_XMIN_COMMITTED;
                        SetBufferCommitInfoNeedsSave(buffer);
                }
        }

        /* by here, the inserting transaction has committed */

        if (tuple->t_infomask & HEAP_XMAX_INVALID)        /* xid invalid or aborted */
                return true;

        if (tuple->t_infomask & HEAP_XMAX_COMMITTED)
        {
                if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
                        return true;
                return false;                        /* updated by other */
        }

        if (TransactionIdIsCurrentTransactionId(HeapTupleHeaderGetXmax(tuple)))
        {
                if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
                        return true;
                return false;
        }

        if (!TransactionIdDidCommit(HeapTupleHeaderGetXmax(tuple)))
        {
                if (TransactionIdDidAbort(HeapTupleHeaderGetXmax(tuple)))
                {
                        tuple->t_infomask |= HEAP_XMAX_INVALID;
                        SetBufferCommitInfoNeedsSave(buffer);
                }
                return true;
        }

        /* xmax transaction committed */

        if (tuple->t_infomask & HEAP_MARKED_FOR_UPDATE)
        {
                tuple->t_infomask |= HEAP_XMAX_INVALID;
                SetBufferCommitInfoNeedsSave(buffer);
                return true;
        }

        tuple->t_infomask |= HEAP_XMAX_COMMITTED;
        SetBufferCommitInfoNeedsSave(buffer);
        return false;
}
回复

使用道具 举报

0

主题

45

帖子

32.00

积分

新手上路

Rank: 1

积分
32.00
发表于 2020-12-19 21:45:01 | 显示全部楼层
cs.style   &=   ~LVS_TYPEMASK;//去取窗口或控件风格LVS_TYPEMASK
cs.style   |=   LVS_REPORT; //增加窗口或控件风格LVS_REPORT

注释不是已经说的很清楚了么

像LVS_REPORT都是定义好的常数来着,比如说4,   现在cs.style是2

可以用一条式子说明一下
2|4=6
上面式子转成2进制
010|100=110


就是说现在cs.style为6
当传入函数后,函数实现就会进行拆分,方法可以是&~ 就是或运算的逆运算,判断是不是有这个选项LVS_REPORT设置
这些常数的值都是经过设计的 所有常数中任意两个数或运算之后只有唯一的值
在函数实现里面就可以根据这些值进行判断


回复

使用道具 举报

1

主题

39

帖子

27.00

积分

新手上路

Rank: 1

积分
27.00
发表于 2020-12-20 00:15:01 | 显示全部楼层
&    与, 两个为1才是1,其他都是0
|    或, 两个为0才是0,其他为1
^    亦或, 两个相同是0,两个不同为1
&=   a &= b; 等于 a = a & b;
|=    如上
^=    如上

技巧:
与,可以用来屏蔽掉某些位, 或保留某些位, 用一个数,零位就可以用来屏蔽,1位就可以用来保留原状
0xffff & 0x00ff == 0x00ff, 屏蔽掉 高位0xff00,保留低位 0x00ff;
或,可以用来设置某些位,因为不会改变原来的1位,只能改变零位,可以让多个设置组合起来.
0x000f | 0x00f0 == 0x00ff;
然后可以用与来判断是否设置了这个位
0x00ff & ox00f0 == 0x00f0;  



回复

使用道具 举报

0

主题

2

帖子

2.00

积分

新手上路

Rank: 1

积分
2.00
发表于 2021-3-12 17:08:40 | 显示全部楼层
Think of ! as a thing that inverts all the bits
0 -> 1
1 -> 0
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|CopyRight © 2008-2023|verysource.com ( 京ICP备17048824号-1 )

快速回复 返回顶部 返回列表