Objective c 理解按位AND运算符
我在Kochan的书《Objective-C编程》中读到了Objective-C中的位运算符 我对这一部分感到非常困惑,尽管到目前为止,我已经真正理解了向我介绍的大部分其他内容 以下是这本书的一段话: 按位AND运算符 位ANDing常用于掩蔽操作。也就是说,可以轻松地使用该运算符将数据项的特定位设置为0。例如,声明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中最
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好的,谢谢我以前在什么地方听说过,我猜是的