Вы знаете, что цифры хранятся в двоичном формате в памяти, правильно? Таким образом, вы можете просто изучить каждый бит, один за другим и распечатать результат, когда вы идете:
Вы можете изучить бит с использованием побитовых операторов . Вы можете создать двоичный номер 1000 0000 0000 0000
с номера 1
по левый сдвиг число 31 место: 1<<31
. Затем вы можете проверить, имеет ли ваш номер 32-й бит с побитовым и: (1<<31) & decimal
. Если результат равен нулю, этот бит не был установлен. Если результат отличен от нуля, бит был установлен.
Предполагая одноразрядных значение (обычно это называется маска) хранится в unsigned int
, вы можете проверить 31-й бит правой кнопкой сдвигая его однажды:
unsigned int mask = 1 << 31; // mask for 32nd bit
mask = mask >> 1; // move mask to 31st bit
if (mask & decimal != 0) {
// 31st bit is set
}
else {
// not set
}
спользование unsigned int
является очень важно. Если вы используете обычный (подписанный) int
, то оператор >>
имеет другое поведение. Для чисел без знака при смещении вправо левая сторона дополняется нулями. Для подписанных чисел левая сторона вместо этого дополняется любым значением (0 или 1) в самом старшем бите. Итак, если у вас есть , подписанное двоичное значение 1000 0000 0000 0000
, и вы переместите его вправо 1 (signed_mask >> 1
), то в итоге вы получите 1100 0000 0000 0000
, а не 0100 0000 0000 0000
.
Вот рабочий пример:
#include <stdio.h>
int main(int argc, char *argv[]) {
int i, j, decimal;
printf("enter a valid integer between 0 and 2147483647\n");
scanf("%d",&decimal);
fflush(stdin);
// all signed integers are <= 2147483647, so just check if it's positive
if (decimal>0) {
// create a "mask" to look at the 32nd bit
// note that we use an unsigned mask!
// this is important because we don't want
// sign-extending when we shift to the next bit.
unsigned int mask = 1<<31;
for (i=0; i<8; i++) {
for (j=0; j<4; j++) {
// check current bit, and print
char c = (decimal & mask) == 0 ? '0' : '1';
putchar(c);
// move down one bit
mask >>= 1;
}
// print a space very 4 bits
putchar(' ');
}
putchar('\n');
}
return 0;
}
Примечание условие decimal>0||decimal<2147483647
в вашем коде всегда верно. Я думаю, вы хотели использовать &&
, а не ||
. Однако 2147483647
является максимальным значением для подписанного 32-битного целого числа (2 -1), поэтому на самом деле не имеет смысла проверять верхнюю границу.
Обычно вам нужно сначала отправить свою попытку (не беспокойтесь, если это не так). – artm
Обеспечьте [mcve]. – Olaf
И 'fflush'ing' stdin' - это неопределенное поведение. – Olaf