了解按位AND运算符

我一直在阅读Kochan的书“Objective-C编程”中的Objective-C中的位运算符。

我对这部分非常困惑,尽管到目前为止,我已经真正理解了其他所有呈现给我的所有内容。

以下是该书的一段引文:

按位与运算符

按位与经常用于屏蔽操作。 也就是说,可以很容易地使用该操作符将数据项的特定位设置为0.例如,该语句

w3 = w1 & 3;

将w1的值与常数3按位与进行分配。这与将w中的所有位设置相同,除了最右边的两位为0并保留来自w1的最右边的两位。

与C中的所有二元算术运算符一样,二进制位运算符也可以通过添加等号来用作赋值运算符。 该声明

word &= 15;

因此执行与以下相同的功能:

word = word & 15;

此外,它的作用是将除了最右边四个字以外的所有字都设置为0.在使用常量执行按位运算时,通常以八进制或十六进制表示常量更方便。

好的,这就是我想要理解的。 现在,我对这个概念非常困惑,如果有人愿意帮我解决这个问题,我只是想寻求一点澄清。

当这本书现在引用“设置所有比特”时,所有的比特......究竟是什么。 这不仅仅是二垒的0或1,换句话说,二进制?

如果是这样,在第一个例子中,为什么除了“最右边的2”到0之外的所有位? 是2,因为它是3 - 1,从我们的常数中取3?

谢谢!


数字可以用二进制表示如下:

3    = 000011
5    = 000101
10   = 001010

...等等。 我假设你熟悉二进制。

按位AND意味着取两个数字,将它们排列在一起,然后创建一个新的数字,其中两个数字都为1(其他数字均为0)。

例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001

按位或表示采用两个数字,将它们排列在一起,然后创建一个新的数字,其中任一数字都为1(其他数字都为0)。

例如:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111

按位XOR(异或)意味着取两个数字,将它们排列在一起,然后创建一个新的数字,其中一个数字有1且另一个数字有0(其他都是0)。

例如:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  

按位NOR(不是OR)意味着采用两位数的按位或,然后撤销所有事情(现在有一个0,现在有一个1,现在有一个1,现在有一个0)。

按位NAND(不是AND)意味着采用两位数的按位与,然后撤销一切(其中有一个0,现在有一个1,现在有一个1,现在有一个0)。

继续:为什么word &= 15会将最右边的4位全部设置为0? 你现在应该可以弄清楚了......

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl

0 AND a = 0 0 AND b = 0 ,... j AND 1 = ji AND 1 = i ,...)

这有用吗? 在很多语言中,我们使用称为“位掩码”的东西。 一个位掩码本质上是一个数字,代表大量小数字组合在一起。 我们可以使用OR将数字组合在一起,并使用AND将它们分开。 例如:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

如果我只有地图和帽子,我可以将其表示为myInventoryBitmask = (MagicMap | MagicHat) ,结果是我的位掩码。 如果我什么都没有,那么我的位掩码是0.如果我想看看我是否有魔杖,那么我可以这样做:

int hasWand = (myInventoryBitmask & MagicWand);
if (hasWand > 0) {
  printf("I have a wandn");
} else {
  printf("I don't have a wandn");
}

得到它?

编辑:更多的东西

您还会遇到“位移”运算符:<<和>>。 这只是意味着“将所有东西都转移到n位”或“将所有东西都转移到n位”。

换一种说法:

1 << 3 = 0001 << 3 = 0001000 = 8

和:

8 >> 2 = 01000 >> 2 = 010 = 2


“位”是“二进制数字”的简称。 是的,它是0或1.几乎总是8个字节,它们写得有点像十进制数字 - 左边是最重要的数字,右边是最不重要的数字。

在你的例子中, w1 & 3屏蔽了除了两个最不重要的(最右边的)数字之外的所有数字,因为二进制中的3是00000011.(2 + 1)如果任一位是AND,AND操作返回0,所以除最后两位自动为0。


w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab

0和任何位N = 0

1和任何位N = N

因此,除了最后两位设置为0之外,任何按位3结尾的所有位都将被保留。最后两位,即a和b在这种情况下被保留。

链接地址: http://www.djcxy.com/p/1997.html

上一篇: Understanding the bitwise AND Operator

下一篇: How to count the number of set bits in a 32