计算机中数据和类型相关概念(小小总结,不太行)
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) |