符号计算

2019-2020-1 20175311胡济栋 《信息安全系统设计基础》第四周学习总结教材学习

我怕爱的太早我们不能终老 提交于 2020-03-05 22:59:36
2019-2020-1 20175311胡济栋 《信息安全系统设计基础》第四周学习总结教材学习 2.1信息存储 基础概念 机器即程序将 内存 视为一个非常大的 字节数组 ,称为 虚拟内存 。 内存的每个 字节 都有 唯一的数字 标识,称为它的 地址 。所有可能地址的集合就称为 虚拟空间地址 。字长用来指明 整数和指针数据 的标称大小,虚拟地址空间的大小由 字长 决定,对于一个字长为w位的机器而言,虚拟地址的范围为 0-2^w-1 。 字节 是最小的可寻址的存储器单位。 十六进制表示法:若位的总数不是4的倍数,最左边的一组可以少于4位,前面用0补足。字长指明整数和指针数据的标称大小。 C语言的一个很有用的特性就是它支持按位布尔运算。 位级运算 :&(与),|(或),~(取反),^(异或),运算时都是按位进行计算。 逻辑运算 :|| OR 或;&& AND 与;! NOT 非。 移位运算 :一般而言,机器支持两种形式的右移: 逻辑右移、算术右移 。 逻辑右移 (x>>>k)在左端补k个0,得到的结果是[0,…,0,xn-1,xn-2,…,xk]。 算术右移 (x>>k)是在左端补k个最高有效位的值,得到的结果是[xn-1,…,xn-1,xn-1,xn-2,…,xk]。 字节顺序 字节顺序是网络编程的基础,是指占内存多于一个字节类型的数据在内存中的存放顺序,通常有小端、大端两种字节顺序。

计算符号函数的值

為{幸葍}努か 提交于 2020-03-05 22:53:35
对于任一整数n,符号函数sign(n)的定义如下: 请编写程序计算该函数对任一输入整数的值。 输入格式: 输入在一行中给出整数n。 输出格式: 在一行中按照格式“sign(n) = 函数值”输出该整数n对应的函数值。 输入样例1: 10 输出样例1: sign(10) = 1 输入样例2: 0 输出样例2: sign(0) = 0 输入样例3: -98 输出样例3: sign(-98) = -1 # include <stdio.h> # include <stdlib.h> /* run this program using the console pauser or add your own getch, system("pause") or input loop */ int main ( int argc , char * argv [ ] ) { int n = 0 ; scanf ( "%d" , & n ) ; if ( n < 0 ) { printf ( "sign(%d) = %d" , n , - 1 ) ; } else if ( n == 0 ) { printf ( "sign(%d) = %d" , n , 0 ) ; } else { printf ( "sign(%d) = %d" , n , 1 ) ; } return 0 ; } 来源:

原码,反码和补码的关系?

我是研究僧i 提交于 2020-03-05 21:42:03
作者:张天行 链接:https://www.zhihu.com/question/23172611/answer/119406298 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 一、 序言第一版答案写于2016年8月,当时我正试图理解补码规则的逻辑,并用结果写了一篇回答发在知乎和公众号上,因为收到的回复很乐观,让我一度认为已经把握问题的全貌。事实上答案在符号位的论述上存在谬误,多亏知友在回复中指出,为此我进行了更深入的思考,重新编辑此答案,希望能更接近问题的本原。 二、 重温运算规则首先我想把整套关于原码反码补码的运算规则准确清晰地写一遍,方便急需应用的知友参考,也希望大家首先能记住这套规定,再开始进一步的探讨。 所谓原码就是机器数,是加了一位符号位的二进制数,正数符号位为0,负数符号位为1,计算机中存储、处理、运算的数据通常是8位、16位、32位或64位的,这里以最简单的8位为例讲解。注意符号位是包含在8位中的其中1位,故可直观读出的数只有7位(只有后7位数可以按权展开)。有心人可能注意到原码是有缺陷的,它只能表示255种状态,因为00000000(+0)和10000000(-0)其实是一个数,因此原码的表示范围成了-127到+127,这个问题需要神奇的补码来解决,因为在补码中10000000被用来表示-128。 所谓反码,英语里又叫ones

数据类型转换、运算符

霸气de小男生 提交于 2020-03-05 12:22:30
【数据类型转换、运算符】 内容 数据类型转换 算数运算符 比较运算符 逻辑运算符 三元运算符 第一章 数据类型转换 Java程序中要求参与的计算的数据,必须要保证数据类型的一致性,如果数据类型不一致将发生类型的转换。 1.1 自动转换 一个int 类型变量和一个 byte 类型变量进行加法运算, 结果会是什么数据类型? int i = 1; byte b = 2; 运算结果,变量的类型将是 int 类型,这就是出现了数据类型的自动类型转换现象。 自动转换 :将 取值范围小的类型 自动提升为 取值范围大的类型 。 1 public static void main(String[] args) { 2 int i = 1; 3 byte b = 2; 4 // byte x = b + i; // 报错 5 //int类型和byte类型运算,结果是int类型 6 int j = b + i; 7 System.out.println(j); 8 } 转换规则 范围小的类型向范围大的类型提升, byte 、short、char 运算时直接提升为 int 。 byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double 1.2 强制转换 强制类型转换 :将 取值范围大的类型 强制转换成 取值范围小的类型 。        比较而言

转 位运算实现加减乘除运算

不问归期 提交于 2020-03-04 19:08:58
我们知道,计算机最基本的操作单元是字节(byte),一个字节由8个位(bit)组成,一个位只能存储一个0或1,其实也就是高低电平。无论多么复杂的逻辑、庞大的数据、酷炫的界面,最终体现在计算机最底层都只是对0101的存储和运算。因此,了解位运算有助于提升我们对计算机底层操作原理的理解。 今天就来看看怎么不使用显式“ + - * /”运算符来实现加减乘除运算。 下面我们一个一个来看。 1. 加法运算 先来个我们最熟悉的十进制的加法运算: 13 + 9 = 22 我们像这样来拆分这个运算过程: 不考虑进位,分别对各位数进行相加,结果为sum: 个位数3加上9为2;十位数1加上0为1; 最终结果为12; 只考虑进位,结果为carry: 3 + 9 有进位,进位的值为10; 如果步骤2所得进位结果carry不为0,对步骤1所得sum,步骤2所得carry重复步骤1、 2、3;如果carry为0则结束,最终结果为步骤1所得sum: 这里即是对sum = 12 和carry = 10重复以上三个步骤,(a) 不考虑进位,分别对各位数进行相加:sum = 22; (b) 只考虑进位: 上一步没有进位,所以carry = 0; (c) 步骤2carry = 0,结束,结果为sum = 22. 我们发现这三板斧行得通! 那我们现在还使用上面的三板斧把十进制运算放在二进制中看看是不是也行的通。

java的位运算

风流意气都作罢 提交于 2020-03-04 19:03:16
 在日常的Java开发中,位运算使用的不多,使用的更多的是算数运算(+、-、*、/、%)、关系运算(<、>、<=、>=、==、!=)和逻辑运算(&&、||、!),所以相对来说对位运算不是那么熟悉,本文将以Java的位运算来详细介绍下位运算及其应用。 1、 位运算起源   位运算起源于C语言的低级操作,Java的设计初衷是嵌入到电视机顶盒内,所以这种低级操作方式被保留下来。所谓的低级操作,是因为位运算的操作对象是二进制位,但是这种低级操作对计算机而言是非常简单直接,友好高效的。在简单的低成本处理器上,通常位运算比除法快得多,比乘法快几倍,有时比加法快得多。虽然由于较长的指令流水线和其他架构设计选择,现代处理器通常执行加法和乘法的速度与位运算一样快,但由于资源使用减少,位运算通常会使用较少的功率,所以在一些Java底层算法中,巧妙的使用位运算可以大量减少运行开销。 2、 位运算详解   Java位运算细化划分可以分为按位运算和移位运算,见下表。 细化 符号 描述 运算规则 按位运算 & 与 两位都为1,那么结果为1 | 或 有一位为1,那么结果为1 ~ 非 ~0 = 1,~1 = 0 ^ 异或 两位不相同,结果为1 移位运算 << 左移 各二进制位全部左移N位,高位丢弃,低位补0 >> 右移 各二进制位全部右移N位,若值为正,则在高位插入 0,若值为负,则在高位插入 1 >>>

二进制原码、反码、补码以及Java中的<< 和 >> 和 >>> 详细分析

强颜欢笑 提交于 2020-03-04 18:13:56
1、计算机二进制系统中最小单位bit 在计算机二进制系统中: bit (位) :数据存储的最小单元。 简记为 b ,也称为比特( bit ),每个二进制数字0或1就是一个位( bit ),其中,每 8bit = 1 byte (字节); 再回顾Java 中的数据类型,如 int数据类型 = 4个byte(字节) ,而 1 byte(字节) = 8 bit(位) ;也就我们常说的 int = 32位 (说白了,在二进制系统中是以bit 作为数据存储单元的)。如下 2、有符号数和无符号数 有符号数和无符号数简单的说就是分别对应正数和负数,在二进制系统中是以bit(位)来作为数据存储单元的, 最高位(第一位)是符号位,正数符号位为“0” ,负数符号位为“1” 。 例子: 假设 int number = 1 ,那么number在计算机系统中将表示如下: 00000000 00000000 00000000 00000001 同理可得, number = -1 时,在二进制中表示如下: 10000000 00000000 00000000 00000001 注意:最高位(第一位)是符号位,因为是number值为1是一个正数,所以最高位为0; 3、二进制的原码、反码、补码 原码 原码就是机器数,是加了一位符号位的二进制数(因为数值有正负之分),正数符号位为0,负数符号位为1。 反码

深入理解计算机系统——datalab实验

▼魔方 西西 提交于 2020-03-03 23:49:26
实验目的: 完善bits.c里的各个函数,实现其功能,并通过btest的测试 实验说明: 实验的目标是修改bits.c的副本,以便它通过所有在btest中进行测试而不违反任何编码准则。 1、使用dlc编译器(./dlc)自动检查代码是否符合标准。 命令:unix> ./dlc bits.c 说明:如果代码没有问题,dlc会直接返回,否则,它会打印标记问题的消息。 命令:unix> ./dlc -e bits.c 说明:dlc打印每个功能使用的操作员数量。 2、使用btest进行测试 命令: unix> make btest unix> ./btest [可选命令行参数] 说明:编译和运行btest程序(每次更改bits.c都要执行make btest重新编译)。 命令: unix> ./btest 说明:测试所有功能的正确性并打印出错误信息。 命令: unix> ./btest -g 说明:以紧凑的形式测试所有功能、错误消息。 命令:unix> ./btest -f foo 说明:测试函数foo的正确性。 命令:unix> ./btest -f foo -1 27 -2 0xf 说明:用特定参数测试函数foo是否正确。 3.助手程序 ishow和fshow程序可以查看整数和浮点表示,都需要单个十进制或十六进制数作为参数。要构建它们,执行命令:unix> make 示例用法:

redis中list类型中的ziplist笔记

ぐ巨炮叔叔 提交于 2020-03-03 06:47:40
ZipList(压缩列表): 1. 介绍: 内存连续,无序的数据结构.压缩列表是redis为了节约内存而开发的,由一系列特殊编码的连续内存块 组成的顺序型数据结构. 2. 组成: 3. 压缩列表节点的组成 一个压缩列表可以包含任意多个节点(entry),每个节点可以保存一个字节数组或者一个整数值. 1) previous_entry_length 无符号(1字节) 0到255 2^8-1 >> 255(10进制) FF(16进制) 二进制 1111 1111 8bit 有符号(1字节)-128到127 无符号(2字节) 0到65535 2^16-1 >> 65535(10进制) FFFF(16进制) 二进制 1111 1111 1111 1111 16bit 有符号(2字节) -32768到32765 无符号(4字节) 0到4294967295 2^32-1 >> 4294967295(10进制) FFFF FFFF(16进制) 二进制 1111 1111 1111 1111 1111 1111 1111 1111 32bit 有符号(4字节)-2147483648到2147483647 pervious_entry_length属性以字节为单位,记录了压缩列表中前一个节点的长度. 如果前一节点的长度小于254个字节,那么previous_entry_length属性

原码, 反码, 补码 详解

廉价感情. 提交于 2020-03-02 11:47:39
原码, 反码, 补码 详解 本篇文章讲解了计算机的原码, 反码和补码. 并且进行了深入探求了为何要使用反码和补码, 以及更进一步的论证了为何可以用反码, 补码的加法计算原码的减法. 论证部分如有不对的地方请各位牛人帮忙指正! 希望本文对大家学习计算机基础有所帮助! 一. 机器数和真值 在学习原码, 反码和补码之前, 需要先了解机器数和真值的概念. 1、机器数 一个数在计算机中的二进制表示形式, 叫做这个数的机器数。机器数是带符号的,在计算机用一个数的最高位存放符号, 正数为0, 负数为1. 比如,十进制中的数 +3 ,计算机字长为8位,转换成二进制就是00000011。如果是 -3 ,就是 10000011 。 那么,这里的 00000011 和 10000011 就是机器数。 2、真值 因为第一位是符号位,所以机器数的形式值就不等于真正的数值。例如上面的有符号数 10000011,其最高位1代表负,其真正数值是 -3 而不是形式值131(10000011转换成十进制等于131)。所以,为区别起见,将带符号位的机器数对应的真正数值称为机器数的真值。 例:0000 0001的真值 = +000 0001 = +1,1000 0001的真值 = –000 0001 = –1 二. 原码, 反码, 补码的基础概念和计算方法. 在探求为何机器要使用补码之前, 让我们先了解原码,