自定义view之什么MeasureSpec

测量模式只有3种情况,用2bit就可以存放。int measureSpec:包含测量尺寸和测量模式。int型数据32个bit,将前2个bit用于存放测量模式,后面30个bit存放的是尺寸。取数时,不用每次都写移位<<和取且&操作,用Android内置类MeasureSpec.getMode(),MeasureSpec.getSize()
这里的的尺寸大小getSize()并不是最终View的尺寸大小,而是父View提供的参考大小。
1.MeasureSpec.EXACTLY:表示设置了精确的值,一般当childView设置其宽、高为精确值(例如layout_width="100dp")、match_parent时,父容器会将其设置为EXACTLY;
2.MeasureSpec.AT_MOST:表示子布局被限制在一个最大值内,一般当childView设置其宽、高为wrap_content时,父容器会将其设置为AT_MOST;
3.MeasureSpec.UNSPECIFIED:表示子布局想要多大就多大,一般出现在AadapterView的item的heightMode中、ScrollView的childView的heightMode中;此种模式比较少见。
三种测量模式最高位对应什么?
0-unspecified 00-000000000000000000000000000000
1-exactly 01-000000000000000000000000000000
2-at_most 10-0000000000000000000000000000000(int的最小值)
为什么int的最小值是10-0000000000000000000000000000000?
因为int的最小值是-2^32,32bit只能表示到11-111111111111111111111111111111即-2^31,所以规定-0就是最小值-2^32。并且它没有原码和反码。
计算机为什么用补码?
计算机电路只有加法器,这是为了电路简单,不是设计不出来减法器。人们要解决的是如何把减法变成加法。
使用原码,符号位参与运算导致错误:1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [1000 0010]原= -2
使用反码,0出现了两种表示:1 - 1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]反+ [1111 1110]反= [1111 1111]反= [1000 0000]原= -0
使用补码:1-1 = 1 + (-1) = [0000 0001]原+ [1000 0001]原= [0000 0001]补+ [1111 1111]补= [1 0000 0000]补=[0000 0000]补=[0000 0000]
负数的补码是在反码基础上加了1的,相当于变大了,对于计算机来说是利用1 0000 0000溢出损失使之归零,就不用通过运算得到0。
-128的由来如下:(-1) + (-127) = [1000 0001]原+ [1111 1111]原= [1111 1111]补+ [1000 0001]补= [1000 0000]补
-0的补码来表示-128,所以-128并没有原码和反码表示。(对-128的补码表示[1000 0000]补,算出来的原码是[0000 0000]原,这是不正确的)
补码是怎么来的?
即计算机如何实现减法变成加法?
mod运算的数学定义:x mod y=x -( y * (x/y的下界)),对于负数也适用。
对于时钟,回拨4小时等于前拨8小时,(-4) mod 12 = 8,8 mod 12 = 8,-4和8同余,记为(-4) ≡ 8 (mod 12)。
如果为一个负数找到正数同余数,在模运算的线性可加性下,8也就代替了-4。
x ≡ x (mod 12)(反身性)
(-4) ≡ 8 (mod 12)
x + (-4) ≡ x + 8 (mod 12)(线性可加)
一个数的反码,实际上是这个数对于一个模的同余数,原码的减法和反码的加法通过“≡”建立了关系(反正不是等价关系,也不是一一对应关系)。这里看似用反码也能正确运算,但不要忘了“同余”这个关系没法通过正常加法得到0,只能通过溢出归零的方式。而同余数全体加1,相当于增加了模的值。
1 ≡ 1 (mod 12)(正数的反码是本身)
(-1) ≡ 11 (mod 12)
1 + (-1) ≡ 1 + 11 (mod 12)
反码得12,原码要么是12,要么是-0(在计算机中0当的反码是0),而正确答案是0,如果
1 ≡ 1 (mod 13)(正数的补码是本身)
(-1) ≡ 12 (mod 13)
1 + (-1) ≡ 1 + 12 (mod 13)
补码得13,溢出,归零。
参考:
https://mp.weixin.qq.com/s__biz=MzI0OTQwNDQxMw==&mid=2247483760&idx=1&sn=27cbdd41da43b5b71c9f7a3ae807fae6&chksm=e9934fe2dee4c6f4869f6d46004c2f3a76c3b5aefc1d1acc8acd9504c64e9a8143f21fe2c968&scene=27
https://blog.csdn.net/qq_48435252/article/details/127554025?ops_request_misc=&request_id=&biz_id=102&utm_term=MeasureSpec&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-1-127554025.nonecase&spm=1018.2226.3001.4187