iOS 十进制二进制转换、位运算 笔记

2020-11-26  本文已影响0人  BlackStar暗星

本文目的是为了学习 iOSNS_OPTIONS

typedef NS_OPTIONS(NSUInteger, UIViewAutoresizing) {
    UIViewAutoresizingNone                 = 0,
    UIViewAutoresizingFlexibleLeftMargin   = 1 << 0,
    UIViewAutoresizingFlexibleWidth        = 1 << 1,
    UIViewAutoresizingFlexibleRightMargin  = 1 << 2,
    UIViewAutoresizingFlexibleTopMargin    = 1 << 3,
    UIViewAutoresizingFlexibleHeight       = 1 << 4,
    UIViewAutoresizingFlexibleBottomMargin = 1 << 5
};

对于 1 << 0,1 << 1,1 << 2, 一直不知道什么意思,故将学习内容过来进行记录学习

二进制转十进制

例:0001100101
转换过程 : 从右到左 ,拆分成一个一个数字0 0 0 1 1 0 0 1 0 1,乘以 2 的 N次幂,N为 从右到左的位置下标

1 * 20 + 0 * 21 + 1 * 22+ 0 * 23 + 0 * 24 + 1 * 25 + 1 * 26

= 1+4+32+64 = 101

十进制转二进制

例:101
转换过程 : 除2 ,取余数,商再除2,在取余数,循环下去,直至商为0

101/2 = 50 余 1        
落位 1

50/2 = 25 余 0          
落位 0

25/2 = 12 余 1          
落位 1

12/2 = 6 余 0            
落位 0

6/2 =  3余 0              
落位 0

3/2 =  1余 1              
落位 1

1/2 =  0余 1              
落位 1

从右到左拼接:1100101
所以为 0001100101


注:浮点型 下标

二进制   0  0  0  1  1  0  0  1  0  1  .  0  1  0  1
       ---------------------------------------------
幂      9  8  7  6  5  4  3  2  1  0     -1 -2 -3 -4

如果是小数,小数点后方的幂都是负数

0 * 29 + .... + 0 * 2-1 + 1 * 2-2 + 0 * 2-3 + 1 * 2-4 = 101.3125


位运算

以下内容为纯粘贴部分,仅作为个人笔记,请点击原文链接查看原文


从现代计算机电路来说,只有高电平/低电平两种状态,即为0/1状态,计算机中所有的数据按照具体的编码格式以二进制的形式存储在设备中。

当代码int sum = 11 + 79被执行的时候,计算机直接将两个数的二进制位进行相加和进位操作:

11:  0 0 0 0 1 0 1 1
79:  0 1 0 0 1 1 1 1
————————————————————
90:  0 1 0 1 1 0 1 0

通常来说CPU执行两个数相加操作所花费的时间被我们称作一个时钟周期,而2.0GHz频率的CPU表示可以在一秒执行运算2.010241024*1024个时钟周期。相较于加法运算,下面看一下11*2、11*4的二进制结果:

11:  0 0 0 0 1 0 1 1  *  2
————————————————————
22:  0 0 0 1 0 1 1 0

11:  0 0 0 0 1 0 1 1  *  4
————————————————————
44:  0 0 1 0 1 1 0 0

当某个数乘以2的N次幂的时候,结果等同于将这个数的二进制位置向左移动N位,在代码中我们使用num << N表示将num的二进制数据左移N个位置

假如相乘的两个数都不是2N次幂,这时候编译器会将其中某个值分解成多个2的N次幂相加的结果进行运算。比如37 * 69,这时候CPU会将37分解成32+4+1,然后换算成(69<<5) + (69<<2) + (69<<0)的方式计算出结果。因此,计算两个数相乘通常需要十个左右的时钟周期

两个数相除花费的时钟周期要比乘法还要多得多,其大部分消耗在将数值分解成多个2的N次幂上。除此之外,浮点数涉及到的计算更为复杂,拿float类型来说,总共使用了32bit的存储空间,其中第一位表示正负,2~13位表示整数部分的值,14~32位之中分别存储了小数位以及科学计数的标识值(这里可能并不那么准确)。由于小数位的二进制数据依旧保持2的N次幂特性,假如下面的二进制属于小数位:

1 0 1 1 1 0 0 1

那么这部分小数位的值等于:1/2 + 1/4 + 1/8 + 1/16 + 1/128 = 0.9453125。因此,当你把一个没有任何规律的小数例如3.1415926535898存入计算机的时候,小数点后面会被拆解成很多的2的N次幂进行保存。由于小数位总是有限的,因此当分解的N超出这些位数时导致存储不下,就会出现精度偏差。另一方面,这样的分解计算势必要消耗大量的时钟周期,这也是大量的浮点数运算(cell动态计算)容易引发卡顿的原因。所以,当小数位过多时,改用字符串存储是一个更优的选择。

位运算符

使用的运算符包括下面:

含义 运算符
左移 <<
右移 >>
按位或
按位并 &
按位取反 ~
按位异或 ^
& 操作
0 0 1 0 1 1 1 0   46
1 0 0 1 1 1 0 1   157
———————————————
0 0 0 0 1 1 0 0   12

| 操作
0 0 1 0 1 1 1 0   46
1 0 0 1 1 1 0 1   157
———————————————
1 0 1 1 1 1 1 1   191

~ 操作
0 0 1 0 1 1 1 0   46
———————————————
1 1 0 1 0 0 0 1   209

^ 操作
0 0 1 0 1 1 1 0   46
1 0 0 1 1 1 0 1   157
———————————————
1 0 1 1 0 0 1 1   179
上一篇下一篇

猜你喜欢

热点阅读