理解按位AND运算符

时间:2010-08-06 20:33:56

标签: objective-c operators bit-manipulation bitwise-operators

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

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

以下是本书的引用:

按位AND运算符

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

w3 = w1 & 3;

将w1的值与常数3分配为W1。这具有将w中的所有位设置为相同的效果,除了最右边的两位为0并保留w1中最右边的两位。

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

word &= 15;

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

word = word & 15;

此外,它具有将除最右边的四位字之外的所有字设置为0的效果。当使用常量执行按位运算时,以八进制或十六进制表示法表示常量通常更方便。

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

当书现在引用“设置所有位”时,所有位......究竟是什么。这不仅仅是第二个基数中的0或1,换句话说,二进制?

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

谢谢!

4 个答案:

答案 0 :(得分:146)

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

3    = 000011
5    = 000101
10   = 001010

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

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

例如:

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

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

例如:

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

按位异或(异或)表示取两个数字,将它们排列在一起,并创建一个新的数字,其中一个数字为1,另一个数字为0(其他所有数字为0) 0)。

例如:

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

按位NOR(非OR)表示取两个数字的按位OR,然后反转所有(其中有0,现在有1,其中有1,现在有0)。

按位NAND(非AND)表示取两个数字的按位AND,然后反转所有(其中有0,现在有1,其中有1,现在有0)。

继续:为什么word &= 15将除了最右边的4位之外的所有位都设置为0?你现在应该能够弄清楚......

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

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

这有用吗?在许多语言中,我们使用称为“bitmasks”的东西。位掩码本质上是一个数字,表示组合在一起的一大堆较小数字。我们可以使用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 wand\n");
} else {
  printf("I don't have a wand\n");
}

得到它?

编辑:更多东西

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

换句话说:

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

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

答案 1 :(得分:2)

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

在您的示例中,w1 & 3屏蔽除了两个最低有效(最右边)数字之外的所有数字,因为3(二进制)为00000011.(2 + 1)如果任何一个ANDed为0,则AND操作返回0,所以除最后两位之外的所有内容都自动为0。

答案 2 :(得分:1)

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

0&amp;任何位N = 0

1&amp;任何位N = N

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

答案 3 :(得分:1)

@cHao&amp; all:不!比特不是数字。他们不是零或一个!

嗯,0和1是可能和有效的解释。零和一是典型的解释。

但有点只是一件事,代表一个简单的选择。它说“它是”或“它不是”。它没有说明这件事,“它”本身。它没有告诉它,它是什么。

在大多数情况下,这不会打扰你。您可以随身携带数字(或部分,数字,数字)(或编程语言,cpu和其他硬件的组合,你知道它们是“典型的”),也许你永远不会遇到麻烦它们。

但如果切换“0”和“1”的含义,则没有主要问题。好吧,如果在编译汇编程序时这样做,你会发现它有点问题,因为一些助记符会做其他逻辑,然后他们告诉你他们的名字,数字将被否定等等。

如果需要,请查看http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm

问候

相关问题