- UID
- 73991
注册时间2014-2-15
阅读权限20
最后登录1970-1-1
以武会友
 
TA的每日心情 | 开心 2024-9-26 10:34 |
---|
签到天数: 28 天 [LV.4]偶尔看看III
|
发表于 2015-2-5 10:22:36
|
显示全部楼层
下面是一个比较图,相同的地方,我用*表示,不同的地方,用#表示
1100001 0x61 a
1000001 0x41 A
------------
*#*****
1100010 0x62 b
1000010 0x42 B
------------
*#*****
0x61 跟 0x41 的二进制相比较,只有它们的左数第2个数字不同.
0x62 跟 0x42 也是一样的,这就是规律.
是不是规律,一定要仔细求证才可以. 初学者不可能一下子就找到规律.但当你熟练之后,
可能一眼就会找出规律.
A~Z的变化范围是 0x41~0x5A
a~z的变化范围是 0x61~0x7A
a~z 跟 A~Z 是有一个有规律的对应关系的. 它们的二进制只有左数的第2个数字不同.
通过 与运算 就可以把a 变换成 A了,为什么呢?
因为 与运算 可以实现下面的目的: 跟1进行与运算,则能保证位不变,原先是什么还是什么,
而跟 0进行与运算,则能改变这个位,让这个位变成0,因为任何数跟0与运算都是0.
有了上面的认识之后: 把 110 0001(0x61,a) 扩展成8个二进制位: 0110 0001,
然后 要与运算的值自然就是 1101 1111,其它位保持不变,只有第3个数字变成了0,这是我们
要改变的那一位. 你可能会有疑问了,不是说第2个数字吗,怎么又成了第3个了,因为我们把
位数扩展到了标准的8位. 1101 1111,转换成十六进制就是 0xDF.
有什么疑问,可以共同讨论.
|
|