了解按位与运算符

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

我对这个部分非常困惑,尽pipe到目前为止,我已经真正理解了所有其他的东西。

这是一本书的引用:

按位与运算符

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

w3 = w1 & 3; 

将w1的值与常数3按位“与”分配给w3。这具有将w中除了最右边两位之外的所有位设置为0并保留来自w1的最右边两位的相同的作用。

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

 word &= 15; 

因此执行与以下相同的function:

 word = word & 15; 

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

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

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

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

谢谢!

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

 3 = 000011 5 = 000101 10 = 001010 

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

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

例如:

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

按位或是指取两个数字,将它们排列在一起,然后创build一个数字为1的新数字(其他数字都为0)。

例如:

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

按位“异或”(异或)意味着取两个数字,将它们排列在一起,然后创build一个新的数字,其中一个数字为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 wand\n"); } else { printf("I don't have a wand\n"); } 

得到它?

编辑:更多的东西

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

换一种说法:

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

和:

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

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

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

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

0和任何位N = 0

1和任何位N = N

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

@cHao&all: 不! 位不是数字。 他们不是零或一个!

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

但有一点是唯一的,代表一个简单的select。 它说“是”或“不是”。 它并没有说什么关于这个东西,“它”本身。 它不知道,它是什么东西。

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

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

如果你愿意的话,请看http://webdocs.cs.ualberta.ca/~amaral/courses/329/webslides/Topic2-DeMorganLaws/sld017.htm

问候