Objective c 理解按位AND运算符

Objective c 理解按位AND运算符,objective-c,operators,bit-manipulation,bitwise-operators,Objective C,Operators,Bit Manipulation,Bitwise Operators,我在Kochan的书《Objective-C编程》中读到了Objective-C中的位运算符 我对这一部分感到非常困惑,尽管到目前为止,我已经真正理解了向我介绍的大部分其他内容 以下是这本书的一段话: 按位AND运算符 位ANDing常用于掩蔽操作。也就是说,可以轻松地使用该运算符将数据项的特定位设置为0。例如,声明 w3 = w1 & 3; word &= 15; 将w1的值按位分配给w3,并与常数3进行AND运算。这与将w中除最右边的两位之外的所有位设置为0并保留w1中最

我在Kochan的书《Objective-C编程》中读到了Objective-C中的位运算符

我对这一部分感到非常困惑,尽管到目前为止,我已经真正理解了向我介绍的大部分其他内容

以下是这本书的一段话:

按位AND运算符

位ANDing常用于掩蔽操作。也就是说,可以轻松地使用该运算符将数据项的特定位设置为0。例如,声明

w3 = w1 & 3;
word &= 15;
将w1的值按位分配给w3,并与常数3进行AND运算。这与将w中除最右边的两位之外的所有位设置为0并保留w1中最右边的两位的效果相同

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

w3 = w1 & 3;
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
    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111
    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
按位“或”表示取两个数字,将它们排列在一起,然后创建一个新的数字,其中任何一个数字都有一个1(其他所有数字都是0)

例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001
    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111
    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
按位异或(异或)意味着取两个数字,将它们排列在一起,然后创建一个新的数字,其中一个数字有一个1,另一个数字有一个0(其他所有数字都是0)

例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001
    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111
    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  
int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
按位NOR(Not OR)表示取两个数字的按位OR,然后反转所有数字(如果有0,现在有1,如果有1,现在有0)

按位与非门(Not AND)意味着取两个数字的按位与非门,然后反转所有数字(在有0的地方,现在有1,在有1的地方,现在有0)

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

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl
0和a=0
0和b=0
,…
j和1=j
i和1=i
,…)

这有什么用?在许多语言中,我们使用称为“位掩码”的东西。位掩码本质上是一个数字,它表示一组较小的数字组合在一起。我们可以使用OR将数字组合在一起,然后使用and将它们分开。例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001
    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111
    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  
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位”

换言之:

12
=
01000>>2
=
010
=2

“位”是“二进制数字”的缩写。是的,它是0或1。一个字节中几乎总是有8,它们的书写方式有点像十进制数字——最高有效位在左边,最低有效位在右边

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

w1 =    ????...??ab
3  =    0000...0011
--------------------
&  =    0000...00ab
0&任意位N=0

1&任意位N=N


因此,任何与3按位AND的运算都将其所有位(最后两位除外)设置为0。最后两位,即本例中的a和b将被保留。

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

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

但比特只是一种东西,代表着一种简单的选择。它说“是”或“不是”。它没有说任何关于“它”本身的东西,也没有说它是什么东西

在大多数情况下,这不会困扰你。你可以像你(或者编程语言、cpu和其他硬件的组合,你称之为“典型”)通常做的那样,将它们视为数字(或数字的部分、数字),也许你永远不会遇到麻烦

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

如果你想看的话,请看一看


您好

哇!非常感谢您的回复。根据这个在线计算器:3=11 5=101 10=1010您是否在二进制数或类似的数字前面加了前缀?@BOSS是的,我加了前缀0以使它们对齐,并确保它们不是负的“2s补码”数字。@Dave好的,谢谢我以前在什么地方听说过,我猜是的