Ответ подразумевает неподписанное, измените для вашей конкретной домашней работы
Если какой-либо из битов установлен в третьем или четвертом байте, то вы не можете его подогнать, поэтому ваш учитель хочет что-то вроде:
//check the third byte for bits //check the 4th byte for bits
retbool = (((unsigned char)(x >> 16) & 0xFF) | ((unsigned char)(x >> 24) & 0xFF)));
Если установлены какие-либо биты в этих байтах, вы не можете вписать квадрат в 32-битное целое число.Если бы вопрос был о unsigned int 32, это был бы конец, но с битом знака вы должны также выполнить некоторую проверку второго байта, поскольку 0xFFFF * 0xFFFF больше, чем max со знаком int.
Поскольку выникогда не может действительно иметь отрицательный квадрат, вариант без знака должен быть альтернативным ответом, но я не написал это назначение.
РЕДАКТИРОВАТЬ (если битовый паттерн уникален, вы должны замаскировать...)
#include <stdio.h>
int doesFit(int x);
typedef unsigned char uchar;
typedef unsigned short ushort;
#define MAX_POS_SQUARE 46340
#define MAX_NEG_SQUARE -46340
int main(void) {
int x=MAX_NEG_SQUARE -2;
int fits = -1;
int prevoiusly_fit = 0;
for(;x<MAX_POS_SQUARE+5;x++){
fits = doesFit(x);
if(!fits && prevoiusly_fit){
printf("%d didnt fit and %d did\n",x,x-1);
}
else if(fits && !prevoiusly_fit){
printf("%d fit and %d did not\n",x,x-1);
}
prevoiusly_fit = fits;
}
return 0;
}
int doesFit(int x){
uchar bits_left = 16;
ushort pos_mask = ((0xb5 << 8) | 0x04);
ushort neg_mask = ((0xb5 << 8) | 0x05);
ushort x_16_low = (((-x) & 0xff << 8 ) | (-x) & 0xff); //used in negative case
ushort x_16_high = (-x)>>16; //used in negative case
//Handle the negative case
//printf("0x%04x x: 0x%04x x_16_low: 0x%04x x_16_high:", x, x_16_low, x_16_high);
if(x>>31){
//how can you tell if a value x < -46340
if( (x_16_high & 0xFF) | (x_16_high >>8 & 0xFF)){
//doesnt fit, maybe dont use compliment use ! if accidental promotion occurs
printf("bailing out when x=%d\n", x);
return 0;
}
while(bits_left){
--bits_left;
if(x_16_low & (1 << bits_left)){
if(!(neg_mask & (1 << bits_left))){
return 0;
}
}
else if(!(x_16_low & (1 << bits_left))){
if(neg_mask & (1 << bits_left)){
return 1;
}
}
//high bits matched with max value bits, cant tell yet, keep masking.
}
}
else{ //handle the positive case
//how can you tell if a value x > 46340
if( (x >> 16 & 0xFF) | (x >>24 & 0x7F)){
//doesnt fit, return false
return 0;
}
while(bits_left){
--bits_left;
if(x & (1 << bits_left)){
if(!(pos_mask & (1 << bits_left))){
return 0;
}
}
else if(!(x & (1 << bits_left))){
if(pos_mask & (1 << bits_left)){
return 1;
}
}
//high bits matched with max value bits, cant tell yet, keep masking.
}
}
return 1; //Must be the exact size to fit to get to this return
}
Вывод:
-46341 подходит, а -46342 не
46341 не подходит, а 46340
Я чувствую, что просто потратил час своей жизни, выполняя эту домашнюю работу, ребята ...