今天接到某公司的笔试题:
#include<iostream>
#include<math.h>
using namespace std;
//正整数。负整数;
//怎么样表现出来二进制
int len = 0;//存放转化为二进制后有几位;
int v[16];//存放转化为二进制后的值;
//十进制化二进制
void Ten_to_Two_zheng(short int n)
{
int i, j = 0;
i = n;
while (i)
{
v[j] = i % 2;//高位存储在低标
i /= 2;
j++;
len++;
}
//正数取反后,得到的是某个负数的补码,求该补码的原码=补码取反+1,符号位不变
}
void Ten_to_Two_fu(short int n){
int fabs_n = fabs(n);//求负数的原码先,符号位已经考虑
Ten_to_Two_zheng(fabs_n);//按正整数计算其二进制形式,即负数的原码
cout << endl;
}
//按要求对输入的数进行按位取反;取反后化成十进制
int qufan(short int k) {
int m = 0;
if (k >= 0) {
Ten_to_Two_zheng(k);
//题目要求,对整数的补码(原码)按位取反
for (int i = 0; i < 16; i++) {
if (v[i] == 1)
v[i] = 0;
else
v[i] = 1;
}
//正数按位取反后得到的是符号位为1的数,编译器认为它是某个负数的补码,所以除符号位外需要再次按位取反加1,求得这个负数的原码,此时符号位不参与运算仍是负;
for (int i = 0; i < 15; i++) {
if (v[i] == 1)
v[i] = 0;
else
v[i] = 1;
}
//对求出的某个负数的原码转化为10进制,符号位不参与运算,用于决定符号为负
int j = 0;
for (int i = 0; i < 15; i++) {
if (v[i] == 0) {
m += 0;
j++;
}
else
{
m += pow(2, j);
j++;
}
}
m =-(m + 1);
}
else if (k < 0) {
//先使用Ten_to_Two_fu(k);求负数的原码
//由于负数在内存中以其补码形式存放,补码=反码+1,正常应该先算出负数在内存中的补码,再对补码取按位反
//但是补码取反=(反码+1)取反 = 反码取反-1 = 原码-1 ;
//所以 结果=原码-1;
Ten_to_Two_fu(k);
//对原码按位取反得到反码
for (int i = 0; i < 16; i++) {
if (v[i] == 1)
v[i] = 0;
else
v[i] = 1;
}
//对反码再次按位取反
for (int i = 0; i < 16; i++) {
//对v取按位反的结果
if (v[i] == 1)
v[i] = 0;
else
v[i] = 1;
}
int j = 0;
for (int i = 0; i < 16; i++) {
if (v[i] == 0) {
m += 0;
j++;
}
else
{
m += pow(2, j);
j++;
}
}
m = m - 1;//
}
return m;
}
//插入排序
void sort(int *arr,int n) {
int i,j;
for (i = 1; i < n; i++) //从无序组的第一个元素开始
if (arr[i] < arr[i - 1]) // 判断是否要向前寻找插入的位置
{
int temp = arr[i];
for (j = i - 1; j >= 0 && arr[j] > temp; j--) //将大于自己的数依次向后挪位
arr[j + 1] = arr[j];
arr[j + 1] = temp; //插入
}
}
int main() {
int k;
cout << "请输入数据的总个数" << endl;
cin >> k;
short int * arr = (short int *)malloc(k * sizeof(short int));
int * b = ( int *)malloc(k * sizeof(int));
cout << "请依次输入数据,以换行符为间隔" << endl;
for (int i = 0; i < k; i++) {
cin >> arr[i];
cout << "~取反后" << ~arr[i];
b[i]=qufan(arr[i]);
memset(v, 0, sizeof(v));//重置全局变量
len = 0;
}
cout << "所有数据取按位反后的结果为:" << endl;
for (int i = 0; i < k; i++) {
cout << b[i]<<" ";
}cout << endl;
sort(b,k);
cout << "排序结果为:" << endl;
for (int i = 0; i < k; i++) {
cout << b[i] << " ";
}
free(arr);
arr = NULL;
free(b);
b = NULL;
}