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

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

以下是这本书的一段话:

The Bitwise AND Operator

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

w3 = w1 & 3;

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

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

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

按位或意味着取两个数字,将它们排成一行,然后创建一个新的数字,其中任何一个数字都有一个1(其他所有数字都是0).

例如:

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

按位异或(异或)意味着取两个数字,将它们排列在一起,创建一个新的数字,其中一个数字有一个1,另一个数字有一个0(其他所有数字都是0).

例如:

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

按位NOR(Not OR)表示取两个数字的按位OR,然后反转所有数字(如果有0,现在有1,如果有1,现在有0).

按位与非门(Not 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, ...)

How is this useful? In many languages, we use things called "bitmasks". A bitmask is essentially a number that represents a whole bunch of smaller numbers combined together. We can combine numbers together using OR, and pull them apart using AND. 例如:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;

如果我只有 map 和帽子,我可以表示为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");
}

了解了?

编辑:更多内容

You'll also come across the "bitshift" operator: << and >>. This just means "shift everything left n bits" or "shift everything right n bits".

换句话说:

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

以及:

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

Objective-c相关问答推荐

可供学习的 iOS 示例项目

ios10:viewDidLoad 框架宽度/高度未正确初始化

ARC下归零弱引用的集合

iOS 块和对自身的强/弱引用

如何知道 NSAssert 在发布版本中是否被禁用?

如何更改 UICollectionView 中的滚动方向?

Apple 的 API 中的k前缀表示什么?

UIViewController 的 prefersStatusBarHidden 不起作用

Objective C 中的调用方法或发送消息

Objective-C 中的非正式协议?

NSMutableArray 按顺序添加对象

立即检测 iOS 方向变化

如何将 nil 添加到 nsmutablearray?

iOS是静态框架还是动态框架?

强制iOS应用程序崩溃的最快方法是什么?

为什么 LLDB 不能打印 view.bounds?

允许用户从 UILabel 中 Select 文本进行复制

可以在 NSLocalizedString 中使用变量和/或参数吗?

无法从其 DataSource 获取单元格

如何在 Objective-c 中将数组声明为常量?