Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2618004
  • 博文数量: 315
  • 博客积分: 3901
  • 博客等级: 少校
  • 技术积分: 3640
  • 用 户 组: 普通用户
  • 注册时间: 2011-05-08 15:32
个人简介

知乎:https://www.zhihu.com/people/monkey.d.luffy Android高级开发交流群2: 752871516

文章分类

全部博文(315)

文章存档

2019年(2)

2018年(1)

2016年(7)

2015年(32)

2014年(39)

2013年(109)

2012年(81)

2011年(44)

分类: 嵌入式

2011-08-16 13:19:15

                                             计算机中数据和类型相关概念(小小总结,不太行)
1. 能执行程序的计算机和能运算的计算机的区别
 1.1 执行程序的计算机必须支持相应的文件格式(ELF)
 1.2 能运算的计算机是不需要操作系统的(计算机的本质就是运算)
 1.3 而能执行程序的计算机不仅需要操作系统,而且需要编译器,需要硬盘....

2. 计算机的数学运算都是通过逻辑运算来实现的。
 比如 加法都是用异或 ,乘法和除法是通过移位, 还有一些位运算(在arm汇编的时候,位运算显得很重要,因为要对寄存器的某个位进行操作)

 2.1 既然加法是通过异或来实现的,那么加法器的逻辑门电路相对就好理解了。(似乎根据真值表好点)
   2.1.1 首先不考虑进位,那么要得到结果,那么只要A 和 B 异或就得到 C
   2.1.1 其次考虑进位, 那么只要再加上进位,即 C 和 Cin 异或就好了,这是第二个考虑
   2.1.2 现在考虑进位输出,首先 A 和 B 的结果与(得到S1),输出 1 或者 0 就能看出本身是否有进位,当然这还不能作为进位输出,因为还有Cin。 现在考虑有Cin的情况,如果将S1 直接或,看上去满足,其实当A B 为 0 而,Cin为1 时不满足了,所以经cin先与 C 与了以后,在跟 S1 或就OK 了,可能这样还不是很清晰。
   2.1.3 当然这还不是一个完整的,因为还有一个溢出的东西没考虑。
 
3. 补码(缺乏练习)
  3.1 进制之间的转换,练熟就好了。不然很不爽的。
  3.2 用补码比较好,0 的表示就唯一了,只有正0。(补码的表示为 整数取反加1, 这样看来的话,00...取反加1还是 0 ,所以只有正0)
  3.3 其实给你一个数,比如1111111 问你是多少,你一看只要加上1,为0了,那么好的,就是-1了,其他类似。10000000这个数只要加上100000000就为0了,所以是-128。还是挺好算的,整数就是本身啦。然后范围的问题也就明白多了,8位数范围 -128 -> 0 -> 127 -> ,呵呵,确实要好好理解。这些东西其实挺有用的。
  3.4 小技巧,意思不大
   如是0xFFFFFFFF   -1  // 0xFFFFFFFFF + 1 == 0, so it's -1
      0xFFFFFFFE   -2
      0xFFFFFFFD    -3
      0xFFFFFFFC    -4  其实还有一个技巧就是,C是12(remember),加上4就是16, so it's -4
      0xFFFFFFFB    -5
      0xFFFFFFFA    -6
      0xFFFFFFAB    -(0x55) 这里可以这样的,B + 5 == 16, A + B's进位 + 5 == 16 ,so it's 55

4. 位操作。
   4.1 设置某位,比如第17位(set_bit)和get_bit: 首先定义一个掩码 int umask = 1 << 17 (左移17位)
     4.1.1 set_bit 为0
    num = num & (~umask)
     4.1.2 set_bit 为1
    num = num || umask
     4.1.3 get_bit 17, return (1 || 0)
        temp = num & umask
        return temp;
  4.2 统计1的个数
     这个只要一个变量保存最低为的值,判断是1,计数器就加1,然后在对该数移位操作,然后在保存,然后在判断。while循环条件就是该值移位为0为止,当然这只是适用于找1的个数。(0就是相反个数吗??)
  4.3 循环移位的实现(假设是32位的整数)
    int umask = 1 << 31;
     思路:1. 设置一个int temp用来保存int number的最低伪 temp = number & 1, number = number >> 1;
          2. 根据temp的值是1 还是 0 来给第31位赋值,如果是1:number = number || umask;
                           如果是0:number = number & (~umask);
阅读(1674) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~