位运算
bit (位)
在计算机中,由于只有逻辑0
和逻辑1
的存在,因此很多东西、动作、数字都要表示为一串二进制的字码例如: 1001 0000 1101
等等。其中每一个逻辑0
或者1
便是一个位。例如这个例子里的1000 1110
共有八个位,它的英文名字叫(bit
),是计算机中最基本的单位。
Byte (字节)
所谓的字节 Byte
,是由八个位组成的一个单元,也就是8个bit组成1个Byte。字节有什么用呢? 在计算机科学中,用于表示ASCII
字符,便是运用字节来记录表示字母和一些符号~例如字符A
便用 0100 0001
来表示。
Word (字)
而字节以上,便是字:16个位为一个字,它代表计算机处理指令或数据的二进制数位数,是计算机进行数据存储和数据处理的运算的单位。通常称16位是一个字,而32位呢,则是一个双字,64位是两个双字。
高地址和低地址
高字节和低字节
如 int a = 268543471
,化为十六进制是0x1001 A5EF
则EF
属于低字节,10
属于高字节
大端模式
高位字节排放在内存的低地址端,低位字节排放在内存的高地址端
内存地址 | 0x0001 | 0x0002 | 0x0003 | 0x0004 |
---|---|---|---|---|
存放内容 | 0x10 | 0x01 | 0xA5 | 0xEF |
小端模式
低位字节排放在内存的低地址端,高位字节排放在内存的高地址端
内存地址 | 0x0001 | 0x0002 | 0x0003 | 0x0004 |
---|---|---|---|---|
存放内容 | 0xEF | 0xA5 | 0x01 | 0x10 |
位运算符
运算符 | 描述 | 实例 |
---|---|---|
& | 按位与操作,按二进制位进行’与’运算。运算规则: 0 & 0 = 0; 0 & 1 = 0; 1 & 0 = 0; 1 & 1 = 1; |
A = 0011 1100 B = 0000 1101 A & B = 0000 1100 即结果为 12 |
| | 按位或运算符,按二进制位进行’或’运算。运算规则: 0 | 0 = 0; 0 | 1 = 1; 1 | 0 = 1; 1 | 1 = 1; |
A = 0011 1100 B = 0000 1101 A | B = 0011 1101 即结果为 61 |
^ | 异或运算符,按二进制位进行”异或”运算。运算规则: 0 ^ 0 = 0; 0 ^ 1 = 1; 1 ^ 0 = 1; 1 ^ 1 = 0; |
A = 0011 1100 B = 0000 1101 A ^ B = 0011 0001 即结果为 49 |
~ | 取反运算符,按二进制位进行”取反”运算。运算规则: ~1 = 0; ~0 = 1; |
A = 0011 1100 ~A = 1100 0011 一个有符号二进制数的补码形式 |
« | 二进制左移运算符。 将一个运算对象的各二进制位全部左移若干位(左边的二进制位丢弃,右边补0)。 |
A = 0011 1100 A « 2 = 1111 0000 即结果为 240 |
» | 二进制右移运算符。 将一个数的各二进制位全部右移若干位,正数左补0,负数左补1,右边丢弃。 |
A = 0011 1100 A » 2 = 0000 1111 即结果为 15 |
应用
十六进制的颜色值转化为RGB
let hex = 0x2196f3
let r = CGFloat((hex >> 16) & 0xff)
let g = CGFloat((hex >> 8) & 0xff)
let b = CGFloat((hex >> 0) & 0xff)
let color = UIColor(red: r / 255.0, green: g / 255.0, blue: b / 255.0, alpha: 1.0)
view.backgroundColor = color