理解按位AND运算符

Qco*_*com 48 bit-manipulation objective-c operators bitwise-operators

我一直在阅读Kochan的书"Objective-C编程"中的Objective-C中的位运算符.

我对这一部分非常困惑,尽管到目前为止我已经真正了解了大部分内容.

以下是本书的引用:

按位AND运算符

按位AND运算经常用于屏蔽操作.也就是说,可以容易地使用该运算符将数据项的特定位设置为0.例如,语句

w3 = w1 & 3;
Run Code Online (Sandbox Code Playgroud)

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

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

word &= 15;
Run Code Online (Sandbox Code Playgroud)

因此执行与以下相同的功能:

word = word & 15;
Run Code Online (Sandbox Code Playgroud)

此外,它具有将除最右边的四位字之外的所有字设置为0的效果.当使用常量执行按位运算时,以八进制或十六进制表示法表示常量通常更方便.

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

当书现在引用"设置所有位"时,所有位......究竟是什么.这不仅仅是第二个基数中的0或1,换句话说,二进制?

如果是这样,为什么在第一个例子中除了"最右边2"到0之外的所有位?它是2,因为它是3 - 1,从我们的常数中取3吗?

谢谢!

Dav*_*ong 148

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

3    = 000011
5    = 000101
10   = 001010
Run Code Online (Sandbox Code Playgroud)

...等等.我假设你熟悉二进制文件.

按位AND意味着取两个数字,将它们排列在一起,并创建一个新的数字,其中两个数字都为1(其他一切都为0).

例如:

    3          =>  00011
  & 5          =>  00101
------           -------
    1              00001
Run Code Online (Sandbox Code Playgroud)

按位OR意味着取两个数字,将它们排列在一起,并创建一个新的数字,其中任一个数字为1(其他一切都为0).

例如:

    3          =>  00011
  | 5          =>  00101
------           -------
    7              00111
Run Code Online (Sandbox Code Playgroud)

按位XOR(异或)表示取两个数字,将它们排列在一起,并创建一个新数字,其中任一数字为1,另一个数字为0(其他全部为0).

例如:

    3          =>  00011
  ^ 5          =>  00101
------           -------
    6              00110  
Run Code Online (Sandbox Code Playgroud)

按位NOR(非OR)表示取两个数的按位或,然后反转所有(其中有0,现在有1,其中有1,现在有0).

按位NAND(非AND)意味着采用两个数字的按位AND,然后反转所有(其中有0,现在有1,其中有1,现在有0).

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

     n          =>  abcdefghjikl
  & 15          =>  000000001111
------            --------------
     ?              00000000jikl
Run Code Online (Sandbox Code Playgroud)

(0 AND a = 0,0 AND b = 0,... j AND 1 = j,i AND 1 = i...)

这有用吗?在许多语言中,我们使用称为"bitmasks"的东西.位掩码本质上是一个数字,表示组合在一起的一大堆较小数字.我们可以使用OR将数字组合在一起,并使用AND将它们分开.例如:

int MagicMap = 1;
int MagicWand = 2;
int MagicHat = 4;
Run Code Online (Sandbox Code Playgroud)

如果我只有地图和帽子,我可以表示为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");
}
Run Code Online (Sandbox Code Playgroud)

得到它?

编辑:更多的东西

你还会遇到"bitshift"运算符:<<和>>.这只是意味着"将所有内容都移位n位"或"将所有内容都移位n位".

换一种说法:

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

和:

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

  • 哇!非常感谢您的回复。据此在线计算器提供:http://www.convertit.com/go/convertit/calculators/math/base_converter.asp 3 = 11 5 = 101 10 = 1010您是否在二进制数之前加了前缀? (2认同)
  • @BOSS是的,我给0加上前缀以使其对齐,并确保它们不是负的“ 2s-complement”数字。 (2认同)