这篇文章我们一起来看看Objective-C位运算符Objective-C语言中有各种各样的运算符可处理数字中的特定位,如下表所示:

 符号  运算
 &  按位与
 |  按位或
 ^  按位异或
 ~  一次求反
 <<  向左移位
 >>  向右移位

表中列出的所有运算符,除一次求反运算符(~)外,都是二元运算符,因此需要两个运算数。位运算符可处理任何类型的整型值,但不能处理浮点值。

1、按位运算符

对两个值执行与运算时,会逐位比较两个值的二进制表示。第一个值与第二个值对应位都为1时,在结果的对应位上就会得到1,其他的组合在结果中都得到0。如果b1和b2表示两个运算数的对应位,那么下表(称为真值表)就显示了在b1和b2所有可能值下对b1和b2执行与操作的结果。

b1   b2   b1 & b2
——————————
0     0         0
0     1         0
1     0         0
1     1         1

例如,如果w1和w2都定义为short int , w1等于十六进制的15 ,  w2等于十六进制的0c,那么以下C语句会将值0x04指派给w3。

w3 = w1 & w2;

将w1、w2和w3都表示为二进制后可更清楚地看到此过程,假设所处理的short int大小为16位。

w1    0000 0000 0001 0101     0x15
w2    0000 0000 0000 1100   & 0x0c
————————————————————
w3    0000 0000 0000 0100     0x04

按位与运算经常用于屏蔽运算。就是说,这个运算符可轻易地将数据项的特定位设置为0。例如,语句

w3 = w1 & 3;

将w1与常量3按位与所得的值指派给w3。它的作用是将w3中的全部位(而非最右边的两位)设置为0,并保留w1中最左边的两位。

与Objective-C中使用的所有二元运算符相同,通过添加等号,二元位运算符可同样用作赋值运算符。因此语句

word &= 15;

与下列语句

word = word & 15;

执行相同的功能。

此外,它还能将word的全部位设置为0,但最右边的四位除外。

2、按位或运算符

在Objective-C中对两个值执行按位或运算时,会逐位比较两个值的二进制表示。此时,只要第一个值或者第二个值的相应位是1。那么结果的对应位就是1。按位或操作符的真值表如下所示。

b1    b2    b1 | b2
———————————
0      0          0
0      1          1
1      0          1
1      1          1

所以,如果w1是short int,等于十六进制的19, w2也是short int,等于十六进制的6a,那么对w1和vv2执行按位或会得到十六进制的7b,如下所示:

w1    0000 0000 0001 1001      0x19
w2    0000 0000 0110 1010   |  0x6a
————————————————————
        0000 0000 0111 1011      0x7b

按位或操作通常就称为按位OR,用于将某个词的特定位设为1。例如,以下语句将w1最右边的三位设为1,而不管这些位操作前的状态是什么都是如此。

w1 = w1 | 07;

当然,可以在语句中使用特殊的斌值运算符,如下面的语句所示:

w1 |= 07;

我们在后面会提供一个程序例子,演示如何使用按位或运算符。

3、按位异或运算符

按位异或运算符,通常称为XOR运算符,遵守以下规则:对干两个运算数的相应位,如果任何一个位是1,但不是两者全为1,那么结果的对应位将是1,否则是0。该运算符的真值表如
下所示:

b1     b2     b1 ^ b2
————————————
0       0           0
0       1           1
1       0           1
1       1           0

如果w1和w2分别等于十六进制的5e和d6,那么w1与w2执行异或运算后的结果是十六进制值e8,如下所示:

w1     0000 0000 0101 1110     0x5e
w2     0000 0000 1011 0110  ^ 0xd6
——————————————————————
         0000 0000 1110 1000     0xe8

本文就先讲到这里,对于Objective-C位运算符我们下一篇继续探讨,下次主要讨论一下Objective-C位运算符中的一次求反、向左移位运算、向右移位运算,下回见。

1、一次求反运算

一次求反运算符是一元运算符,它的作用仅是对运算数的位“翻转”。将运算数的每个是1的位翻转为0,而将每个是0的位翻转为1。此处提供真值表只是为了保持内容的完整性。

b1    ~b1
——————
0        1
1        0

如果w1是short int,  16位长,等于十六进制值a52f,那么对该值执行一次求反运算会得到十六进制值5ab0:

w1    1010  0101  0010  1111  0xa52f
~w1  0101  1010  1101  0000  0x5ab0

如果不知道运算中数值的准确位大小,那么一次求反运算符非常有用,使用它可让程序不会依赖于整数数据类型的特定大小。例如,要将类型为int的w1的最低位设为0,可将一个所有位都是1、但最右边的位是0的int值与w1进行与运算。所以像下面这样的C语句在用32位表示整数的机器上可正常工作。

w1 &= 0xFFFFFFFE;

如果用

w1 &= ~1;

替换上面的语句,那么在任何机器上w1都会同正确的值进行与运算。

这是因为这条语句会对1求反,然后在左侧会加入足够的1,以满足int的大小要求(在32位机器上,会在左侧的31个位上加入1)。

现在,显示一个实际的程序例子,说明各种位运算符的用途

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// Bitwise operators illustrated
#import <foundation foundation.h="">
int main (int argc, char *argv[])
{
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
unsigned int w1 = 0xA0A0A0A0, w2 = 0xFFFF0000,
w3 = 0x00007777;
NSLog (@”%x %x %x”, w1 & w2, w1 | w2, w1 ^ w2);
NSLog (@”%x %x %x”, ~w1, ~w2, ~w3);
NSLog (@”%x %x %x”, w1 ^ w1, w1 & ~w2, w1 | w2 | w3);
NSLog (@”%x %x”, w1 | w2 & w3, w1 | w2 & ~w3);
NSLog (@”%x %x”, ~(~w1 & ~w2), ~(~w1 | ~w2));
[pool drain];
return 0;
}</foundation>

结果输出:

a0a00000 ffffa0a0 5f5fa0a0
5f5f5f5f ffff ffff8888
0 a0a0 fffff7f7
a0a0a0a0 ffffa0a0
ffffa0a0 a0a00000

对代码中的每个运算都演算一遍,确定你理解了这些结果是如何得到的。

在第四个NSLog调用中,需要注意重要的一点,即按位与运算符的优先级要高于按位或运算符,因为这会实际影响表达式的最终结果值。

第五个NSLog调用展示了DeMorgan的规则:~(~a & ~b)等于a | b,~(~a | ~b)等于a & b。

2、向左移位运算符

对值执行向左移位运算时,按照字面的意思,值中包含的位将向左移动。与该操作关联的是该值要移动的位置(或位)数目。超出数据项的高位的位将丢失,而从低位移入的值总为0。因此,如果w1等于3,那么表达式

w1 = w1 << 1;

可同样表示成

w1 <<= 1;

结果就是3向左移一位,这样产生的6将赋值给w1。

w1              ... 0000 0011 0x03
w1 << 1      ... 0000 0110 0x06

3、向右移位运算符

顾名思义,向右移位运算符(>>)把值的位向右移动。从值的低位移出的位将丢失。把无符号的值向右移位总是左侧(就是高位)移人0。对于有符号值而言,左侧移入1还是0依赖于被移动数字的符号,还取决于该操作在计算机上的实现方式。如果符号位是0(表示该值是正的),不管哪种机器都将移人0。然而,如果符号位是1,那么在一些计算机上将移人1,而其他计算机上则移入0。前一类型的运算符通常称为算术右移,而后者通常称为逻辑右移。

如果w1是unsigned int,用32位表示它并且它等于+六进制的F777EE22,那么使用语句

w1 >>= 1;

将w1右移一位后,w1等于十六进制的7BBBF711,如下所示:

w1             1111 0111 0111 0111 1110 1110 0010 0010 0xF777EE22
w1 >> 1     0111 1011 1011 1011 1111 0111 0001 0001 0x7BBBF711

如果将w1声明为(有符号)的short int,在某些计算机上会得到相同的结果;而在其他计算机上,如果将该运算作为算术右移来执行,结果将会是FBBBF711。

应该注意到,如果试图用大于或等于该数据项的位数将值向左或向右移位,那么该Objective-C语言并不会产生规定的结果。因此,例如计算机用32位表示整数,那么把一个整数向左或向右移动32位或更多位时,并不会在计算机上产生规定的结果。还注意到,如果使用负数对值移位时,结果将同样是未定义的。

好了,通过这两篇文章的介绍,大家应该对Objective-C位运算符有一定了解了吧。

转载于:https://www.cnblogs.com/pengyingh/articles/2357033.html

Objective-C中的位运算符用法相关推荐

  1. 详解Python中的位运算符规则、原理与用法

    在Python中,位运算符包括位与(&).位或(|).位求反(~).位异或(^).左移位(<<)和右移位(>>). 1. 运算方法与规则 位运算符只能适用于整数,其总体 ...

  2. C语言中的位运算符主要有哪些?逻辑右移与算术右移的区别?

    逻辑右移与算术右移的区别? 逻辑右移就是不考虑符号位,右移一位,左边补零即可. 算术右移需要考虑符号位,右移一位,若符号位为1,就在左边补1,:否则,就补0. 所以算术右移也可以进行有符号位的除法,右 ...

  3. linux 脚本中除法运算符,Linux中Shell的算数运算符和位运算符用法笔记

    1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...

  4. Linux中Shell的算数运算符和位运算符用法笔记

    1.算数运算符 算数运算符主要是加.减.乘.除.余.幂等常见的算术运算,以及加等.减等.乘等.除等.余等复合算术运算. 注意:Shell只支持整数运算,小数部分会舍去.一般情况下算术运行需要个let命 ...

  5. Java中的位运算符、移位运算

    一.位运算 Java中有4个位运算,它们的运算规则如下: (1)按位与 (&)  :两位全为1,结果为1,否则为0: (2)按位或  (|)   :两位有一个为1,结果为1,否则为0: (3) ...

  6. Java中按位运算符

    Java定义了几个按位运算符,可以应用于整数类型, 如:long,int,short,char和byte.按位运算符处理位并执行逐位运算. 假设a = 60且b = 13; 采用二进制格式, 原文链接 ...

  7. 分享:Python中的位运算符

    按位运算符是把数字看作二进制来进行计算的.用的不太多,简单了解. 下表中变量 a 为 60,b 为 13二进制格式如下: a = 0011 1100 b = 0000 1101 a&b = 0 ...

  8. 单片机C语言中的位运算符,单片机c语言教程第八课 运算符和表达式(位运算符)...

    学过汇编的朋友都知道汇编对位的处理能力是很强的,但是单片机C语言也能对运算对象进行按位操作,从而使单片机C语言也能具有一定的对硬件直接进行操作的能力.位运算符的作用是按位对变量进行运算,但是并不改变参 ...

  9. JAVA中的位运算符

    缺省情况下,位运算符针对int类型数据进行操作. 位运算有以下几种: 与运算符"&":将两个操作数的二进制位进行按位与运算,如果对应的二进制位都是1时,该位的结果为1,否则 ...

  10. python中的位运算符

    很多人最开始接触位运算符的时候,简直就是一脸懵逼,压根就不知道什么跟什么,今天我就来给大家介绍一下,什么是位运算符. 位运算符包括&,|,^,~,<<,>>六种. 在介 ...

最新文章

  1. python正则表达式_Python正则表达式简记和re库!
  2. CSS Media媒体查询
  3. 让tableView的高度等于contentSize的高度、动态调整tableView的高度、tableView的高度自适应布局...
  4. C#中结构体定义并转换字节数组
  5. 电信版iPhone 4S最低套餐49元
  6. 【华为云技术分享】9 个Java 异常处理的规则!
  7. mysql效率索引_mysql下普通索引和唯一索引的效率对比
  8. linux单块网卡绑定多个ip及网卡聚合绑定多个ip方法
  9. RDP(远程桌面很慢) slow performance, Hyper-V,IPv4 Checksum offload
  10. [2018.10.10 T3] 三米诺
  11. 文档型数据库Mongodb
  12. 如何做好学术演讲-01
  13. 【MySQL - 3】数据库可视化工具SQLyog的安装使用及DML操作大全(CUD)
  14. unity build-in管线中的PBR材质Shader分析研究
  15. this java 错误_java异常错误处理
  16. 闲聊: 女神异闻录4
  17. 极智AI | 量化实现分享五:详解格灵深瞳 EQ 量化算法实现
  18. BufferedInputStream的作用比较
  19. HackTheBox-baby CachedView
  20. 一个小程序员年薪五万的悲哀生活和他的理财梦

热门文章

  1. 230. 二叉搜索树中第K小的元素
  2. CS224n笔记11 GRU和NMT的进一步话题
  3. Oracle 恢复删除的表
  4. HDU3065 AC自动机
  5. Effective JAVA 创建和销毁对象 遇到多参构造器考虑使用构建器
  6. CFileDialog多选文件的最大数量
  7. SqlHelper和数据访问层
  8. 扩展NameValueCollection
  9. Application Wizard生成的项目文件简介
  10. 098 元类(metaclass)