嵌入式软件工程师笔试面试指南-问题答疑(持续更新中)

news/2024/7/19 13:15:44 标签: 嵌入式, 笔试面试, 秋招, 笔试题目

文章目录

    • 为什么-n=~ (n-1)=~ n+1?
      • 解答
    • 结构体所占字节数
      • 解答

鉴于有些问题,大家有些疑惑。我会把大家问到的问题,整理在这个文章中,方便大家观看。

为什么-n=~ (n-1)=~ n+1?

解答

该问题来源于嵌入式软件开发面试知识点总结P141(旧版本的,估计很多人手中应该没有这个版本)。

原问题为:不用除法操作符如何实现两个正整数的除法。
在这里插入图片描述

粉丝的疑问在于表达式-n=~ (n-1)=~ n+1 。解决这个问题的核心在于,要知道计算机中是如何存储数值的。

在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码可以将符号位和其他位统一处理;同时,减法也可以按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。

如何求补码呢?

  1. 正数的补码

    与原码相同。

    +9的补码是00001001。

  2. 负数的补码

    对其原码逐位取反,但符号位除外;然后整个数加1

    -7的原码为10000111,按位取反为11111000,加1可得11111001。所以-7的补码是11111001。

补码表示方式有很多,以上两个例子都是使用8位的2进制来表示的。此外,还有16位2进制补码表示形式,以及32位2进制补码表示形式等。

如何快速求补码?

从最低位开始至找到的第一个1均不变,符号位不变,这之间的各位“求反”(0变1;1变0)。

原码:1010 1001 补码:1101 0111。

举例

下面,我们举个例子验证下上面的等式。假设n = 10,则可以得到下面的各个表达式。

n:10 = 00001010
-n:-10 = 11110110
n-1:9 = 00001001
~(n-1):-10 = 11110110
~n:-11 = 11110101
~n+1 = 11110110

代码验证

算的对不对呢?可以写个代码验证下。

#include <stdlib.h>
#include <stdio.h>

int PrintBinary(int bi,int len){
	
	int i=0;
	while(i<len){

		int tmp = 1;
		//从最左位开始比较,该位是1
		if((bi & (tmp<<(len-i-1))) != 0){
			printf(" 1 ");
		}
		else{
			printf(" 0 ");
		}
		i++;   
	}
	printf("\n");
        return 0;
}

int main()
{
    int n = 10;
    printf("n=%d\n",n);
	PrintBinary(n,8);
    printf("-n=%d\n",-n);
	PrintBinary(-n,8);
    printf("n-1=%d\n",n-1);
	PrintBinary(n-1,8);
    printf("~(n-1)=%d\n", ~(n-1));
	PrintBinary(~(n-1),8);
    printf("~n=%d\n", ~n);
	PrintBinary(~n,8);
    printf("~n+1=%d\n", ~n+1);
	PrintBinary(~n+1,8);
    return 0;
}

结果如下。

n=10
 0  0  0  0  1  0  1  0
-n=-10
 1  1  1  1  0  1  1  0
n-1=9
 0  0  0  0  1  0  0  1
~(n-1)=-10
 1  1  1  1  0  1  1  0
~n=-11
 1  1  1  1  0  1  0  1
~n+1=-10
 1  1  1  1  0  1  1  0

常用的位运算技巧

  1. -n=~ (n-1)=~ n+1

  2. 获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)。例如,n=010100,则-n=101100,n&(-n)= 000100。

  3. 去掉整数n的二进制中最后一个1:n&(n-1),如n=010100,n-1=010011,n&(n-1)=010000。

结构体所占字节数

该问题来源于嵌入式软件开发面试知识点总结P150(旧版本的,估计很多人手中应该没有这个版本)。

原问题为:指针进行强制类型转换后与地址进行加法运算,结果是什么?
在这里插入图片描述

struct BBB
{
  long num;
  char *name;
  short int data;
  char ha;
  short ba[5];
}*p;

在32位机器下, sizeof(struct BBB)=24。但是粉丝算的是28。

解答

char指针变量short intintunsigned intfloatdoublelonglong longunsigned long
32位1424448484
64位1824448888

这位粉丝估计是把数据类型所占字节数记错了。

对于32位系统:4+4+2+1+(1)+10+(2)=24

对于64位系统:8+8+2+1+(1)+10+(2)=32

括号中的数字,表示的是为了保证4字节对齐需要填充的字节数。


http://www.niftyadmin.cn/n/1315102.html

相关文章

嵌入式软件工程师笔试面试指南-操作系统

文章目录 操作系统进程和线程什么是进程?什么是线程?进程和线程有什么区别?何时使用多进程,何时使用多线程?进程有几种状态?画一下进程状态转换图?创建进程有哪几种方式?进程间通信方式有哪些?有什么优缺点?线程间同步方法有哪些?什么是内核线程和用户线程?内核线程…

[DUBBO]Dubbo控制台查看方法

1、dubbo控制台安装方法网上较多&#xff0c;例如转载http://dtbuluo.com/blog/archives/37 2、dubbo控制台查看 由于我们组是开发安装的dubbo、zookeeper等等&#xff0c;我是临时上手学习&#xff0c;想查看下注册中心有哪些消费者和提供者。 步骤1&#xff1a;在注册中心的服…

编译驱动模块报错/home/zhongyi/workdir/ebf-buster-linux: No such file or directory. Stop.

错误 今天编译驱动模块的时候报错&#xff0c;具体如下所示。 zhongyiubuntu:~/workdir/linux_driver/device_tree_rgb_led$ make make -C ../ebf-buster-linux/build_image/build M/home/zhongyi/workdir/linux_driver/device_tree_rgb_led modules make[1]: Entering dire…

MySQL DML 整理

DML&#xff08;Data Manipulation Language&#xff09;数据操纵语言statements are used for managing data within schema objects. 由DBMS提供&#xff0c;用于让用户或程序员使用&#xff0c;实现对数据库中数据的操作。DML分成交互型DML和嵌入型DML两类。依据语言的级别&…

《野火i.MX Linux开发实战指南》在线文档错误汇总(持续更新)

第一次玩野火的板子&#xff0c;文档没看多少页&#xff0c;就发现了好多错误&#xff0c;本篇文章将持续更新文档中一些不合适的地方&#xff0c;避免大家踩坑。同时&#xff0c;也欢迎各位小伙伴在评论区提出意见。 文档地址 文档链接&#xff1a;http://doc.embedfire.com/…

ctype.h库函数----字符操作函数

在c中使用时&#xff1a; #include <cctype> 字符判断函数 1、isalnum函数--判断是否是英文字母或数字字符&#xff0c;如果是&#xff0c;则返回非0值&#xff0c;如果不是&#xff0c;则返回0. 函数参数 &#xff1a;可以是字符也可以是整型数字。 用例&#xff1a;if…

【调试技巧】strace神器的使用方法详解与实践

文章目录1. Strace命令简介2. 什么是系统调用3. Strace的参数4. Strace的基本用法5. Strace实战示例5.1 跟踪特定的系统调用5.2 跟踪正在执行的程序5.3 将strace的输出保存到文件中5.4 打印系统调用摘要5.5 跟踪自己的程序6. 总结1. Strace命令简介 strace命令是一个集诊断、调…

正则表达式---总结(1)

正则表达式经常被用于字段或任意字符串的校验&#xff0c;如下面这段校验基本日期格式的JavaScript代码&#xff1a;var reg /^(\\d{1,4})(-|\\/)(\\d{1,2})\\2(\\d{1,2})$/; var r fieldValue.match(reg); if(rnull)alert(Date format error!);1 . 校验密码强…