了解按位与运算符
在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 = j
, i 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 。
问候