CSAPP:
exercise2.12
学习内容:
主要还是对于位运算的掌握
#include<stdio.h>
int show_last_significant_byte(int n){
return (0xff & n);
}
int complement_without_last_byte(int n){
int last_byte = show_last_significant_byte(n);
int complement = ~n;
complement = complement ^ (0xff & complement);
// printf("%x\n", complement);
return (complement + last_byte);
}
int set_last_significant_byte_ones(int n){
int last_byte = show_last_significant_byte(n);
n = n ^ last_byte;
return (n + 0xff);
}
int main()
{
int x = 0x87654321;
int A = show_last_significant_byte(x);
printf("0x%x\n", A);
int B = complement_without_last_byte(x);
printf("0x%x\n", B);
int C = set_last_significant_byte_ones(x);
printf("0x%x\n", C);
}
可能B问还有简化空间,我的思路是先取出这个数a的低8位。然后将该数取反记为!a,之后再将取反后的数低8位与!a进行xor运算,得到低8位为0x00的数,然后与初始的last significant byte相加即可
优化后的解法
#include<stdio.h>
int show_last_significant_byte(int n){
return (0xff & n);
}
int complement_without_last_byte(int n){
return (n ^ ~0xff);
}
int set_last_significant_byte_ones(int n){
return (n | 0xff);
}
int main()
{
int x = 0x87654321;
int A = show_last_significant_byte(x);
printf("0x%x\n", A);
int B = complement_without_last_byte(x);
printf("0x%x\n", B);
int C = set_last_significant_byte_ones(x);
printf("0x%x\n", C);
}
不得不说还得学好离散数学