哈喽,大家好。今天分享下粉丝针对嵌入式软件开发面试知识点总结中的内容提出的两个问题。问题不难,但是容易掉坑里。
而在笔试中,很多大厂都喜欢出这种题目来坑害小伙伴们。所以,大家在笔试前要扎实基础,做题的时候,要看清题目。
问题一为什么-n=~ (n-1)=~ n+1?解答
该问题来源于嵌入式软件开发面试知识点总结P141。原问题为:不用除法操作符如何实现两个正整数的除法。
粉丝的疑问在于表达式-n=~ (n-1)=~ n+1 。解决这个问题的核心在于,要知道计算机中是如何存储数值的。
在计算机系统中,数值一律用补码来表示(存储)。主要原因是使用补码可以将符号位和其他位统一处理;同时,减法也可以按加法来处理。另外,两个用补码表示的数相加时,如果最高位(符号位)有进位,则进位被舍弃。
如何求补码呢?
正数的补码
与原码相同。
+9的补码是。
负数的补码
对其原码逐位取反,但符号位除外;然后整个数加1。
-7的原码为,按位取反为,加1可得。所以-7的补码是。
补码表示方式有很多,以上两个例子都是使用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
#include
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=%dn",n);
PrintBinary(n,8);
printf("-n=%dn",-n);
PrintBinary(-n,8);
printf("n-1=%dn",n-1);
PrintBinary(n-1,8);
printf("~(n-1)=%dn", ~(n-1));
PrintBinary(~(n-1),8);
printf("~n=%dn", ~n);
PrintBinary(~n,8);
printf("~n+1=%dn", ~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
常用的位运算技巧
-n=~ (n-1)=~ n+1
获取整数n的二进制中最后一个1:n&(-n)或者n&~(n-1)。例如,n=,则-n=,n&(-n)= 。
去掉整数n的二进制中最后一个1:n&(n-1),如n=,n-1=,n&(n-1)=。
问题二结构体所占字节数
该问题来源于嵌入式软件开发面试知识点总结P150。原问题为:指针进行强制类型转换后与地址进行加法运算,结果是什么?
struct BBB
{
long num;
char *name;
short int data;
char ha;
short ba[5];
}*p;
在32位机器下, ( BBB)=24。但是粉丝算的是28。
解答
char指针变量short ng long
32位
64位
这位粉丝估计是把数据类型所占字节数记错了。
对于32位系统:4+4+2+1+(1)+10+(2)=24
对于64位系统:8+8+2+1+(1)+10+(2)=32
括号中的数字,表示的是为了保证4字节对齐需要填充的字节数。
总结
粉丝的提问原码补码,在我能力范围内的,我都会回答。有时候,问题不一定能够及时看到。但是,群里大佬也不少,一般都会有人解答的。
因此,我鼓励大家把问题发到交流群里。大家可以互相学习原码补码,互相交流。
因为本公众号申请较晚,暂时没有开通留言功能,欢迎小伙伴们添加我的私人微信【备注:加群】,好友通过后发送【交流群】给我,将自动拉你进群。欢迎小伙伴们找我一块聊天唠嗑,共同学习进步。
往期推荐
扫码加我微信
进技术交流群
文章都看完了
不点个
吗
限时特惠:本站持续每日更新海量各大内部创业课程,一年会员仅需要98元,全站资源免费下载
点击查看详情
站长微信:Jiucxh