二进制的进阶
写在前面:学习到的东西越多,领悟的东西越深,就越来越发现写博客的必要,写文章不仅能记录下这些想法,还会帮助自己思考。这是我写的第一篇文章,以前没写过,只是为了记录和分享一些东西,不管好不好,不喜勿喷 ,给点支持嘛,不喜欢的程序猿/媛绕道即可
。
关键词:二进制、位运算、android多点触控、java NIO
做视频监控,不可能不接触到TCP/IP网络传输这一块,网络传输的基础是二进制流,而在程序设计时候用到十六进制的地方很多,比如有一个协议头的命令号的就是十六进制的。最开始我的做法是用字符串转成,后来开始做android开发后,发现android里的R文件都是以十六进制表示的,然后开始各种脑补十六进制,才发现在java中如果要定义一个十六进制的数,只需要以0x开头,而八进制则是以0开始。
在做android开发的时候,开始慢慢地学习到多点触控,当时很不了解为啥有一个getAction()了还有一个getActionMask(),于是
手残地点进去看了源码,源码是:action&0xff,没看懂,于是去网上看,解释了很多,不过也不是很明白,于是放之置之了。前不久过年回
来,想学习下位移,就开始乱写点测试代码,记得Integer.toBinar()可以把十进制的数转换为二进制,于是就用那个方法把要移位的数字转换为
二进制,这样自己会清楚一些。于是写了几组数作了位元算和位移,不经意间想起android多点触控的那个源码,于是把0xff写出来,先转为二进制看二
进制是什么,突然间发现一件神奇的事情。0xff=11111111,原来十六进制(2^4)的一位代表了二进制的四位,同理八进制(2^3)的
一位代表二进制的三位。瞬间开始理解为什么做游戏都要用十六进制,为什么以前听说在程序的世界,十六进制更简单。程序的世界,量变到质变。开始慢慢步入真
正的高效高级程序世界。当你真正明白了八进制和十六进制在程序设计中的重要作用时,那些年一系列的怎么也学不明白的东西都迎刃而解了。主要是以前这些东西
没有应用场景,很难想象怎么用,于是开始重新认识这些概念:>> << >>> & | ^ ~ 原码、补码、反码、模系统
>> 有符号位右移
>>> 无符号位右移 无论符号位是什么都以0填充
<< 位左移
& 按位与 都为1则为1,否则为0(应用场景:与0xf与截取)
| 按位或 都为0则为0,否则为1(应用场景:与0x0或合并不同位段)
^ 按位异或 相同则为0,否则为1(应用场景:两个整数异或交换值,异或后,0记忆相同值,1则求出相反值)
~ 按位取反 0与1对调
原码:整形数显示出来的二进制
补码:正数的补码与原码相同,负数的补码符号位不变,其余~然后+1(补码变原码一致)(应用场景:在计算机系统中,数值一律用补码来表示(存储),这样可以把符号位和其他位作相同处理,主要原因:使用补码,可以将符号位和其它位统一处理;同时,减法也可按加法来处理。)
反码:~的结果
模系统:“模”
是指一个计量系统的计数范围,或者说该系统中第一个无法表示的数。模系统中往往存在多对互补的数,如果a和b在该系统中互补,那么-a和+b是同样的效
果。在这样的系统中减法问题也可以化成加法问题,只需把减数用相应的补数表示就可以了。把补数用到计算机对数的处理上,就是补码。
案例分析:
1、 android多点触控:android
触控中mAction表示触屏信息,该信息采用十六进制表示,低八位代表动作,高八位代表触控索引,获取动作时则使用0xff&mAction,
当单点触控的时候mAction的结果和0xff&mAction的结果一致,当多点触控时,高八位数大于0,0xff&mAction
得到动作,索引则是通过(mAction&0xff00)>>8,此时mAction和mAction&0xff所得到的将
不一致。
2、JAVA NIO:如果学习和使用过java NIO(nonblocking IO,最糗的是以前有次去面试被问什么是NIO,我说是new IO,唉,又是中式英语惹的祸 )
的同学一定也知道,向selector中注册channel感兴趣的操作时使用到了|操作符,这个设计的精妙之处在于,一个int可以表示32种可能,其
实可以表示2^31-1种的,但是那样规则过于复杂,而且我们想传送的信息其实只有几种,从这个层面上来说用byte反而更节省内存,但是java默认的
整型字面量都是int,每次强转又会给开发人员带来烦恼。
这篇文章逻辑很混乱,要淡定觉得有问题的童鞋还望指出来,可以一起探讨学习