飘云阁

 找回密码
 加入我们

QQ登录

只需一步,快速开始

查看: 3642|回复: 5

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

[复制链接]
  • TA的每日心情
    开心
    2024-1-4 14:31
  • 签到天数: 73 天

    [LV.6]常住居民II

    发表于 2015-2-4 20:37:41 | 显示全部楼层 |阅读模式
    本帖最后由 冷月孤心 于 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是一个公用差值。特别膜拜校长口算出结果。以上纯属个人见解,如有错误,请楼下指正,欢迎各位大神不吝赐教。


    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2015-8-2 16:07
  • 签到天数: 2 天

    [LV.1]初来乍到

    发表于 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了。你的想法是对的啊
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-5-25 11:16
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 2015-2-4 21:02:40 来自手机 | 显示全部楼层
    本帖最后由 sgw888 于 2015-2-5 09:31 编辑

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

    点评

    嗯,就是不想一个值一个值去验算,要是有个有力的证据来快速算出公差值就好了。  详情 回复 发表于 2015-2-4 21:09
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2024-1-4 14:31
  • 签到天数: 73 天

    [LV.6]常住居民II

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

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

    点评

    下面是一个比较图,相同的地方,我用*表示,不同的地方,用#表示 1100001 0x61 a 1000001 0x41 A ------------ *#***** 1100010 0x62 b 1000010 0x42 B ------------ *#***** 0x61 跟 0x41 的二进制相  详情 回复 发表于 2015-2-5 10:22
    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2023-5-25 11:16
  • 签到天数: 25 天

    [LV.4]偶尔看看III

    发表于 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.

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

    PYG19周年生日快乐!
  • TA的每日心情
    开心
    2019-3-17 22:44
  • 签到天数: 132 天

    [LV.7]常住居民III

    发表于 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)
    PYG19周年生日快乐!
    您需要登录后才可以回帖 登录 | 加入我们

    本版积分规则

    快速回复 返回顶部 返回列表