计算机系统(2) 实验二 数据表示实验(上)

简介: 计算机系统(2) 实验二 数据表示实验(上)

一、 实验目标:


了解各种数据类型在计算机中的表示方法

掌握C语言数据类型的位级表示及操作


二、实验环境:


计算机(Intel CPU)

Linux操作系统


三、实验内容与步骤


实验前准备:

实验前首先需要安装GCC编译环境,在我的Ubuntu上已经安装了编译环境,展示如下:


3adfeb6f489d45b9837fbbff32777990.png


根据bits.c中的要求补全以下的函数:

int bitXor(int x, int y);

int tmin(void);

int isTmax(int x);

nt allOddBits(int x);

int negate(int x);

int isAsciiDigit(int x);

int conditional(int x, int y, int z);

int isLessOrEqual(int x, int y);

int logicalNeg(int x);

int howManyBits(int x);

unsigned float_twice(unsigned uf);

unsigned float_i2f(int x);

int float_f2i(unsigned uf);

在Linux下测试以上函数是否正确,指令如下:

编译:./dlc bits.c
测试:make btest
./btest


四、实验结果


1. 根据bits.c中的要求补全以下的函数


(1)int bitXor(int x, int y);


①题目描述:

仅允许使用~和&来实现异或

例子: bitXor(4, 5) = 1

允许的操作符: ~ &

最多操作符数目: 14

②大致思路:

依离散数学知识,可以列出对于单个bit的真值表如下:

4568e93c5e9b47d0ba7dd8f9243521b5.png


796bc0a5539244329af02b9df3f6a365.png

1d73b5d2092f4e148a0ffd308770f465.png

③ 编程实现:


/*
 * bitXor - x^y using only ~ and &
 *   Example: bitXor(4, 5) = 1
 *   Legal ops: ~ &
 *   Max ops: 14
 *   Rating: 1
 */
int bitXor(int x, int y) {
    return ~(~(~x & y) & ~(x & ~y));
}


(2)int tmin(void);


①题目描述:

返回最小的二进制补码

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 4

②大致思路:

对于32位整数,最小值即为0X 8000 0000,即将1左移31位。

③编程实现:


/*
 * tmin - return minimum two's complement integer
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 4
 *   Rating: 1
 */
int tmin(void) {
    return 1 << 31;
}


(3)int isTmax(int x);


① 题目描述:

如果x是最大的二进制补码,返回1;否则,返回0

允许的操作符: ! ~ & ^ | +

最多操作符数目: 10

分值: 2

②大致思路:

可以知道,最大值为0x7fff ffff,加一后将变为0x8000 0000,且此数加上本身后将变为0。本身加本身为0的数只有0和0x8000 0000,因此,只需将0xffffffff排除即可:


③编程实现:


/*
 * isTmax - returns 1 if x is the maximum, two's complement number,
 *     and 0 otherwise
 *   Legal ops: ! ~ & ^ | +
 *   Max ops: 10
 *   Rating: 2
 */
int isTmax(int x) {
    return (!(x + 1 + x + 1)) & (!!(x + 1));
}


(4)int allOddBits(int x);


①题目描述:

如果所有奇数位都为1则返回1;否则返回0

例子: allOddBits(0xFFFFFFFD) = 0

allOddBits(0xAAAAAAAA) = 1

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 12


②大致思路:

在二进制下,有且仅有所有位为奇数的数与0x5555 5555进行与运算后由0xffff ffff,变为0x0000 0000。因此可以通过对其与0x5555 5555进行与运算并取反再进行取逻辑反获得结果。又因为题干中不允许使用大于256的整数,故需要通过一些操作获得0x5555 5555。

可以通过将0x0505分别进行左移4、8、16、24得到4个数,并将四个数求和获得0x5555 5555。


③编程实现:


/*
 * allOddBits - return 1 if all odd-numbered bits in word set to 1
 *   Examples allOddBits(0xFFFFFFFD) = 0, allOddBits(0xAAAAAAAA) = 1
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 12
 *   Rating: 2
 */
int allOddBits(int x) {
    unsigned int a = 85;
    unsigned int b = a + (a << 8) + (a << 16) + (a << 24);
    return !~(b | x);
}


(5)int negate(int x);


①题目描述:

返回x的相反数

例子: negate(1) = -1.

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 5

②大致思路:

即取反并加一返回即可。

③编程实现:


/*
 * negate - return -x
 *   Example: negate(1) = -1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 5
 *   Rating: 2
 */
int negate(int x) {
    return (~x) + 1;
}


(6)int isAsciiDigit(int x);


①题目描述:

如果x是ascii码中的0~9,返回1;否则返回0

例子: isAsciiDigit(0x35) = 1.

isAsciiDigit(0x3a) = 0.

isAsciiDigit(0x05) = 0.

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 15


②大致思路:

即对于每个输入的x,需要满足x>=‘0’且x<=‘9’,因此可以将x与临界值进行作差。并通过右移31位判断对符号位进行判断是0还是1即可。


③编程实现:


/*
 * isAsciiDigit - return 1 if 0x30 <= x <= 0x39 (ASCII codes for characters '0' to '9')
 *   Example: isAsciiDigit(0x35) = 1.
 *            isAsciiDigit(0x3a) = 0.
 *            isAsciiDigit(0x05) = 0.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 15
 *   Rating: 3
 */
int isAsciiDigit(int x) {
    return (!((x + ~48 + 1) >> 31)) & !!((x + ~58 + 1) >> 31);
}


(7)in conditional(int x, int y, int z);


①题目描述:

实现x?y:z

例子: conditional(2,4,5) = 4

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 16


②大致思路:

首先,不难想到,对于x的判断可以通过t=!x进行判断实现,当x为0时返回1;当x不为0时返回0。因此,可以将表达式大致转成( _ &y)|( _ &z)的格式进行配凑。

对于前面的空格,当x不为0,即t=0时,需要 t转换为0xffff ffff(-1)。可以通过对1按位取反再加一1获得。

对于后面的空格,当x为0,即t=1时,也需要 t转换为0xffff ffff(-1)。此时直接对t进行取反并加一即可。


③编程实现:


/*
 * conditional - same as x ? y : z
 *   Example: conditional(2,4,5) = 4
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 16
 *   Rating: 3
 */
int conditional(int x, int y, int z) {
    return ((!x + ~1 + 1) & y) | ((~!x + 1) & z);
}


(8)int isLessOrEqual(int x, int y);


①题目描述:

如果x<=y返回1否则返回0

例子: isLessOrEqual(4,5) = 1.

允许的操作符: ! ~ & ^ | + << >>

最多操作符数目: 24


②大致思路:

首先应该很容易会想到直接采用y-x并判断符号位的方法进行判断,但如果作差相减,有可能会发生int类型溢出,因此需要考虑其他方法。

a. 当x,y同号:此时,即可将问题转化为转换为p=y-x>=0,并对p的符号位(通过右移获得)进行判断,获得运行结果。


b.当x,y异号:此时只要x>=0,就可以返回0,否则返回1。


c.是否同号的判断:可以通过对符号位进行求和判断是否同号。


③编程实现:


/*
 * isLessOrEqual - if x <= y  then return 1, else return 0
 *   Example: isLessOrEqual(4,5) = 1.
 *   Legal ops: ! ~ & ^ | + << >>
 *   Max ops: 24
 *   Rating: 3
 */
int isLessOrEqual(int x, int y) {
    int a = x >> 31;
    int b = y >> 31;
    int c = a + b;
    int p = y + (~x + 1);
    int q = !((p >> 31) & 1);
    int r = (c & (a & 1)) | ((~c) & q);
    return r;
}
相关文章
|
存储 编译器 C语言
【深入理解函数栈帧:探索函数调用的内部机制】
【深入理解函数栈帧:探索函数调用的内部机制】
409 0
|
IDE Java 编译器
java: 错误: 不支持发行版本 5 java: 错误: 不支持发行版本8 java: 错误: 不支持发行版本17
检查编译器配置:确保你的IDE或编译器已正确配置为使用正确的Java版本。可以在IDE的设置或项目属性中查找并更改Java编译器的版本。
1580 0
|
5月前
|
机器学习/深度学习 算法 PyTorch
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
【DQN实现避障控制】使用Pytorch框架搭建神经网络,基于DQN算法、优先级采样的DQN算法、DQN + 人工势场实现避障控制研究(Matlab、Python实现)
252 0
|
6月前
|
Shell 网络安全 开发工具
项目快速导入git
本文介绍了如何在本地初始化 Git 仓库并将代码提交到远程仓库(如 GitHub 或 Gitee)的基本流程。内容包括安装 Git、创建仓库、添加文件、提交更改以及推送代码到远程仓库的详细步骤,适合初学者快速掌握 Git 的基本使用方法。
959 1
|
7月前
|
Linux Docker Windows
windows docker安装报错适用于 Linux 的 Windows 子系统必须更新到最新版本才能继续。可通过运行 “wsl.exe --update” 进行更新。
适用于 Linux 的 Windows 子系统需更新至最新版本(如 wsl.2.4.11.0.x64.msi)以解决 2025 年 Windows 更新后可能出现的兼容性问题。用户可通过运行 “wsl.exe --update” 或访问提供的链接下载升级包进行更新。
3015 0
|
存储 人工智能 算法
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
路径规划最全综述+代码+可视化绘图(Dijkstra算法+A*算法+RRT算法等)-1
|
Java 关系型数据库 MySQL
java入门项目:学生管理系统(进阶版超详细搭建)
学生管理系统是一个典型的信息管理系统,熟悉并掌握其需求和设计思想对于理解和学习数据库操作和Java编程有非常大的帮助。 分为学生端和教师端 1. 学生端的功能分为登录、注册、查看个人信息、查看成绩、申请修改信息 2. 教师端的功能分为登录、注册、查看学生信息、修改学生信息、删除学生信息、添加学生信息、查看学生申请的修改信息
13355 3
|
运维 测试技术
拆分软件测试流程,一张图秒杀所有面试
本文主要介绍了软件测试流程的核心内容,包括需求分析、测试用例编写、测试执行、缺陷提交及回归测试等关键步骤。以迭代测试为例,详细说明了每个环节的具体操作和注意事项,并提供了一张测试流程图以便理解。测试流程确保了软件质量,是面试中常见的考察点。
1164 7
拆分软件测试流程,一张图秒杀所有面试
|
Java Windows
IDEA不使用lombok,如何快速生成get和set方法
【11月更文挑战第10天】在 IntelliJ IDEA 中生成 `get` 和 `set` 方法有多种方式:通过菜单操作、使用快捷键或自定义模板。菜单操作包括选择“Code”菜单中的“Generate...”,快捷键为“Alt + Insert”。自定义模板可在“File”-&gt;“Settings”-&gt;“Editor”-&gt;“Code Style”-&gt;“Java”中设置。批量生成时,可多选变量一次性生成。
3471 2
|
SQL Java 数据库连接
mybatis使用二:springboot 整合 mybatis,创建开发环境
这篇文章介绍了如何在SpringBoot项目中整合Mybatis和MybatisGenerator,包括添加依赖、配置数据源、修改启动主类、编写Java代码,以及使用Postman进行接口测试。
304 0
mybatis使用二:springboot 整合 mybatis,创建开发环境

热门文章

最新文章