美文网首页
iOS 十进制二进制转换、位运算 笔记

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

作者: BlackStar暗星 | 来源:发表于2020-11-26 15:26 被阅读0次

本文目的是为了学习 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

相关文章

  • 二进制基础

    了解 十进制和二进制的由来 进制转换 位运算 JDK内置的进制转换 Java中的进制 十进制和二进制的又来 十进制...

  • 【算法训练营学习笔记-Week07】位运算的妙用

    位运算 如何从十进制转换为二进制 位运算符号 含义运算符示例左移<<0011 ->0110右移>>0110 -> ...

  • 快速理解位运算符和二进制数

    二进制转十进制,十进制转二进制,位运算符 | 和 & 先看个例子 十进制转二进制如何转换: 以上述67和33数字为...

  • 10/17

    今天老师讲了进制转换和位运算。进制转换就是二进制、八进制、十进制、十六进制的相互转化,位运算包括按位与,按位或,异...

  • 12.21

    今天星期四,今天是牛老师给我们讲课,主要讲了位的运算,包括位运算的运算符,二进制十进制十六进制的转换,位运算的应用...

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

    本文目的是为了学习 iOS 的 NS_OPTIONS 对于 1 << 0,1 << 1,1 << 2, 一直不知...

  • 二进制基础

    二进制转十进制 十进制转二进制 八进制转二进制 二进制的位运算 关于负数的右移与无符号右移运算小结

  • python 的进制转换

    十进制, 二进制相互转换 十进制转换为二进制 二进制转换为十进制 十进制, 八进制相互转换 十进制转换为八进制 八...

  • 无标题文章

    2017-10-17 今天学习了进制之间的转换,常用进制有:二进制,十进制,十六进制,位运算,bit位,byte字...

  • 计算机基础知识

    一,二进制和十进制转换 1.十进制转换为二进制:进行对2取余法计算 2.二进制转换为十进制: 从最后一位开始算,依...

网友评论

      本文标题:iOS 十进制二进制转换、位运算 笔记

      本文链接:https://www.haomeiwen.com/subject/pmpaiktx.html