冷月孤心 发表于 2015-2-4 20:37:41

Nisy C语言第九课中疑问与运算个人见解

本帖最后由 冷月孤心 于 2015-2-4 20:44 编辑

在计算中:
大小写转换大写A的十六进制:0x41,小写a的十六进制:0x61。差值是20.视频中只见校长计算出来个DF,迷茫了好多天,今天翻出来重新计算了一下,得出个结果来
与运算:数值中有一个为0则结果为0
61=01100001
41=01000001
但是61可以和多个数据与运算得出来41,换个其它字母就又不对了。所以通过计算得出来结论,如果用最大值:FF做为参考值来做与运算,最后得出,61的二进制值与DF的二进制值做与运算得出结果41。
DF二进制:
a的与运算的结果:
01100001
11011111               
-------------------      
01000001

大写字母 B 的十六进制: 0x42 ,二进制: 1000010。小写b的十六进制:0x62,二进制:01100010
b的与运算结果:
01100010
11011111
------------------------
01000010
通过验算DF是一个公用差值。特别膜拜校长口算出结果。以上纯属个人见解,如有错误,请楼下指正,欢迎各位大神不吝赐教。


F8LEFT 发表于 2015-2-4 21:01:02

这样想如何,0x20的二进制为00100000,也就是说只有第6个位为1,其余位都是0.
那么假设 每个小写字母上的第6个位均为1,只要第6位变为0,就相当于变相减少 0x20了。小写便变为大写了。
再假设 每个大写字母的第6位均为0,那么把第6位变0,其余位不变,值也不会改变,那么就不会改变大小写了。
于是,把第6位变0的操作便是 & 1101 1111,也就是0xDF了。你的想法是对的啊

sgw888 发表于 2015-2-4 21:02:40

本帖最后由 sgw888 于 2015-2-5 09:31 编辑

与运算,不想改变的位(二进制位),要与1,想改变的位则"与0" 观察一下它们的规律 就能得出要与运算的值了

冷月孤心 发表于 2015-2-4 21:09:00

sgw888 发表于 2015-2-4 21:02
与运算,不想改变的位(二进制位),要与1,想改变的位则"与1" 观察一下它们的规律 就能得出要与运算的值了

嗯,就是不想一个值一个值去验算,要是有个有力的证据来快速算出公差值就好了。

sgw888 发表于 2015-2-5 10:22:36

冷月孤心 发表于 2015-2-4 21:09
嗯,就是不想一个值一个值去验算,要是有个有力的证据来快速算出公差值就好了。

下面是一个比较图,相同的地方,我用*表示,不同的地方,用#表示

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.

有什么疑问,可以共同讨论.

tree_fly 发表于 2015-2-5 16:07:46

本帖最后由 tree_fly 于 2015-2-5 16:29 编辑

让我们抛开位运算符。

前辈在编写ASCII表时候考虑是比较明智的。下面我们完全用二进制思维分析。

8位年代,大写字母的高4位是0100 ,0101,百度搜一下表看下,为了对应关系,前辈们用高4位0110 ,0111来编写小写字母。
所以小写字母比对应的大写字母大了0010 0000,
对于任意大写字母转小写,只要对大写字母的二进制值 与 0010 0000做加法即可。

相反,小转大,减去 0010 0000即可。
演算:
如何做加法运算?
010x xxxx
+0010 0000

如何做减法呢?
补码,对,这个差值的补码就是1101 1111
011x xxxx
+1101 1111


所以,大写字母与小写字母差值是 0010 0000(0x20)或者1101 1111(8位 -0x20,8位以上0xDF)
页: [1]
查看完整版本: Nisy C语言第九课中疑问与运算个人见解