符号计算

【计算机原理】求一个机器数的反码

你离开我真会死。 提交于 2020-01-22 05:24:03
首先,解释一下 反码 的概念:反码是数值存储的一种,简单点说就是在计算机内定点数的表示法之一,除了反码,常用的还有原码,补码,移码等。 暗戳戳地说一下,反码其实是用得很少的~ 但是!反码用处还是挺大的,比如说作为机器数运算的中间数, 虽然用补码更多一些吧 ,再比如说 系统环境设置 ,像linux平台的目录和文件的默认权限的设置umask就是的使用反码原理。 总之,存在即是合理,反码就是这么真实存在的一种编码方式。 其次,套用一下教科书上的东西: 正数的反码是其本身,负数的反码是在其原码的基础上, 符号位不变,其余各个位取反。 老陌在此用自己的理解解释一下,就是说求一个数的反码主要分成两个方向:正数和负数。其中最简单的就是正数了,只要原模原样照搬就可以了;然后是夹在正数和负数中间的0,因为在计算机中0的 原码 和 反码 是分成+0和-0的,所以这个特例还真要分类讨论;最后是负数,整数的做法也就是按位取反,符号位不变,小数的话印象中是有定点小数和浮点小数之分,我记得以前计算浮点小数还要先把小数转换成整数,然后算完了再把小数点向前移动多少位,最后才能求出实际的数值。 综上,在老陌的印象中求反码的难易等级是这样的:正整数(易)--->正小数--->零--->负整数--->负小数(难) 接下来老陌将以8位的二进制机器数为例,其中首位为符号位(0为正,1为负),所以决定真值范围的也是后面的7位

Android Protect-0.Apk文件结构简介

佐手、 提交于 2020-01-21 01:21:07
文章目录 1. APK 文件结构 2. APK 文件的生成流程 3. classes.dex 3.1 DEX 文件结构 3.1.1 LEB128 3.1.2 DexHeader 3.1.3 DexMapList 3.1.4 DexStringld 3.1.5 DexTypeld 3.1.6 DexProtoId 3.1.7 DexFieldld (标识了类成员) 3.1.8 DexMethodld 3.1.9 DexClassDef 3.2 DEX 文件的验证与优化过程 3.3 DEX 文件的修改 4. AndroidManifest.xml(AXML 文件格式) 4.1 Header 4.2 String Chunk 4.3 ResourceId Chunk 4.4 XmlContent Chunk 4.5 AXML 文件的修改 5.resources.arsc 5.1 ARSC 文件格式 5.1 Header、 String Chunk 5.2 ResTable_package 5.3 TypeStrings、KeyStrings 5.4 ResTable_typeSpec、ResTable_type 6. META-INF 目录 6.1 CERT.RSA 6.2 MANIFEST.MF 6.3 CERT.SF window 中可以配合 Cygwin 查看。 1. APK

栈实现综合计算器(中缀表达式),前缀,中缀,后缀表达式,逆波兰计算器

房东的猫 提交于 2020-01-20 12:49:28
思路: 代码:实现多位数的运算 public class Calculator { public static void main(String[] args) { //根据前面老师思路,完成表达式的运算 String expression = "7*2*2-5+1-5+3-4"; // 15//如何处理多位数的问题? //创建两个栈,数栈,一个符号栈 ArrayStack2 numStack = new ArrayStack2(10); ArrayStack2 operStack = new ArrayStack2(10); //定义需要的相关变量 int index = 0;//用于扫描 int num1 = 0; int num2 = 0; int oper = 0; int res = 0; char ch = ' '; //将每次扫描得到char保存到ch String keepNum = ""; //用于拼接 多位数 //开始while循环的扫描expression while(true) { //依次得到expression 的每一个字符 ch = expression.substring(index, index+1).charAt(0); //判断ch是什么,然后做相应的处理 if(operStack.isOper(ch)) {//如果是运算符 /

7-7 N进制高精度加法 (20分)

萝らか妹 提交于 2020-01-19 23:12:27
到底应该怎样理解进制呢?首先得有“一个”的数量概念,然后就是这样的: 把用来表示数量的符号依次排列,例如: q w e r 然后定义最前面的符号为“零”,即“没有”,后面的符号表示的数量依次比前一个符号多“一个” 进制就这样产生了: 例如当我们数数,依次数到 q w e r ,再往后数一个,符号不够用了,那么就写成 wq 并且,我们把这种进制命名为“wq”进制。 感觉怪异吗? 那么请换成我们熟悉的所谓“10”进制看看: 我们的用于表示数量的符号依次是: 0 1 2 3 4 5 6 7 8 9 , 当数到9,再往后数“一个”时,就数到了 10 看这幅漫画(来源于网络),看看能不能理解“进制”的概念? 现在,给定表示数量的符号(这些符号就形成了某种进制),以及该种进制下的两个不超过100位的正整数,请计算两数之和。 输入格式: 第一行给定表示数量的符号,每个符号为一个字符、各不相同且中间没有空格,最多有30个符号且符号的可能范围是:数字 0 - 9 、大小写字母、 ! 、 @ 、 # 、 $ 、 % 、 ^ 、 & 、 * 、 ( 、 ) 接下来两行每行给出一个该进制下的不超过100位的正整数 输出格式: 在一行中输出该进制下的两数之和。 输入样例1: 0123456789 123 12 输出样例1: 135 输入样例2: abcd bcd bc 输出样例2: cab 1

Java虚拟机13:Java类加载机制

最后都变了- 提交于 2020-01-19 11:48:41
前言 我们知道我们写的程序经过编译后成为了.class文件,.class文件中描述了类的各种信息,最终都需要加载到虚拟机之后才能运行和使用。而虚拟机如何加载这些.class文件?.class文件的信息进入到虚拟机后会发生什么变化?这些都是本文要讲的内容,文章将会讲解加载类加载的每个阶段Java虚拟机需要做什么事(加粗标红)。 类使用的7个阶段 类从被加载到虚拟机内存中开始,到卸载出内存,它的整个生命周期包括:加载(Loading)、验证(Verification)、准备(Preparation)、解析(Resolution)、初始化(Initiallization)、使用(Using)和卸载(Unloading)这7个阶段。其中验证、准备、解析3个部分统称为连接(Linking),这七个阶段的发生顺序如下图: 图中,加载、验证、准备、初始化、卸载这5个阶段的顺序是确定的,类的加载过程必须按照这种顺序按部就班地开始,而解析阶段不一定:它在某些情况下可以初始化阶段之后在开始,这是为了支持Java语言的运行时绑定(也称为动态绑定)。接下来讲解加载、验证、准备、解析、初始化五个步骤,这五个步骤组成了一个完整的类加载过程。使用没什么好说的,卸载属于GC的工作,在之前GC的文章中已经有所提及了。 加载Loading 加载是类加载的第一个阶段。有两种时机会触发类加载: 1、预加载

拼了整整一天,把这个问题搞明白了(看我上一篇文章的问题)

匆匆过客 提交于 2020-01-17 06:32:18
1.模的概念(我只讲个例子,具体的可以查数学中的 "同余模") 在日常生活中,有许多化减为加的例子。例如,时钟是逢12进位,12点也可看作0点。 当将时针从10点调整到5点时有以下两种方法: 1.将时针逆时针方向拨5格,相当于做减法: 10-5=5 2.将时针顺时针方向拨7格,相当于做加法:10+(12-5)=12+5=5 (模为 12) 2.模的运用(采用模得到 补码 ) 1. 补码 的得来:是为了让负数变成能够加的正数,so,负数的 补码 =模-负数的绝对值 比如:-1 补码 :1111 1111(10000 0000 -1得来) 当一个数要减1的时候,可以直接加 1111 1111 2.原码的得来:(负数的原码,直接把对应正数的最高位改为1) 原码能够直观的表示一个负数(能直观的把真值显示出来,如 -1为1000 0001 其中最高位表示符号位,不进行算术计算) 3.总结: 补码 相加,到第9位才舍弃(模10000 0000) 原码相加,到第8位舍弃(模1000 0000) 反码相加,到第8位舍弃(模1000 0000) 3.原码和 补码 之间转换: 1. 补码 =原码减1,再取反(便于理解) 或 补码 = 反码+1(便于描述和推理) 2.演示: 补码 =原码减1,再取反 如-1的原码1000 0001-->1000 0000(减1后)-->1111 1111(取反后) 补码

常见的基本数据结构——栈

六眼飞鱼酱① 提交于 2020-01-16 09:38:48
栈ADT 栈(stack)是限制插入和删除只能在一个位置上进行的表,该位置是表的末端,叫做栈顶。栈的基本操作有进栈(push)和出栈(pop),前者相当于插入,后者相当于删除最后的元素。在最后插入的元素可以通过使用Top例程在执行Pop之前进行考查。对空栈进行的Pop或Top一般被认为是栈ADT的错误。另一方面,当运行Push时空间用尽是一种实现错误,但不是ADT的错误。 栈有时又叫做LIFO(后进先出表)。 栈的实现 由于栈是一个表,因此任何实现表的方法都能够实现栈。两种流行的方法:一种是使用指针实现,一种是使用数组实现。 栈的链表实现 在表的顶端插入实现Push,在表的顶端删除实现Pop,Top只是返回顶端元素,有时Top和Pop两个也可以合二为一。 栈ADT链表的声明实现 struct Node; typedef struct Node *PtrTONode; typedef PtrToNode Stack; struct Node{   ElementType Node;   PtrToNode Next; }; 测试栈是否为空 int IsEmpty(Stack S){   return S->Next == NULL; } 创建一个空栈也很简单,我们只要建立一个头结点,MakeEmpty设置Next指针指向NULL。Push是作为向链表前端进行插入而实现的,其中

Class文件结构

狂风中的少年 提交于 2020-01-16 05:12:09
class文件是一组以8bit字节为基础单位的二进制流,各个数据项目严格按照顺序紧凑的排列在class文件中,中间没有添加任何分隔符。当遇到需要占用8bit字节以上的数据项时,会按照高位在前的方式分割成若干个8bit字节进行存储。 ClassFile结构 类型 名称 数量 u4 magic 1 u2 minor_version 1 u2 major_version 1 u2 constant_pool_count 1 cp_info constant_pool constant_pool_count-1 u2 access_flags 1 u2 this_class 1 u2 super_class 1 u2 interfaces_count 1 u2 interfaces interfaces_count u2 fields_count 1 field_info fields fields_count u2 methods_count 1 method_info methods methods_count u2 attributes_count 1 attribute_info attributes attributes_count MagicNumber 固定值: cafe babe 作用是确定这个文件是否为一个能被jvm所接受的Class文件

CPU能不能比较正负数的大小?CPU又如何做到比较正负数的大小?

梦想的初衷 提交于 2020-01-15 17:01:06
用有限的位数表示带有正负号的数字,当最高位最大数字标识正负且最大数字进位归零,一切就都顺理成章:加法器做纯粹的加法方式的运算,无论有无符号,只会使数字增大,减法器也只会使数字减小,同样与符号无关,无论有无符号,都能减或加到0。不过带来的问题就是不能比大小,因为有符号的负数比正数大,所以,正负数怎么比较大小呢,嘿嘿嘿。。。。 然后第二个问题就随之而来: 如果用10进制设计满足上述计算表示方式的规则,会出现什么情况呢?用1000以内的数字,表示signed型会是如何的景象呢~~ 来源: CSDN 作者: ytfy339784578 链接: https://blog.csdn.net/ytfy339784578/article/details/103946685

第四章-文件和目录

…衆ロ難τιáo~ 提交于 2020-01-14 02:26:18
文件I/O 引言 函数stat、fstat、fstatat和lstat 文件类型 设置用户ID和设置组ID 文件访问权限 函数access和facessat 函数umask 函数chmod、fchmod和fchomodat 函数chown、fchown、fchownat和lchown 文件长度 文件截断 文件系统 函数link、linkat、unlink、unlinkat和remove 函数rename和renameat 创建和读取符号链接 文件的时间 函数futimens、utimensat和utimes 函数mkdir、mkdirat和rmdir 读目录 遍历文件层次结构 函数chdir、fchdir和getcwd 设备特殊文件 引言 本章内容覆盖 文件的所有属性 修改这些属性的各个函数 unix文件系统的结构以及符号链接 对目录进行操作的各个函数 函数stat、fstat、fstatat和lstat # include <sys/types.h> # include <sys/stat.h> # include <unistd.h> int stat ( const char * pathname , struct stat * buf ) ; //返回命名文件有关的信息结构 int fstat ( int fd , struct stat * buf ) ; /