Что не так с моим алгоритмом?

Хорошо, я приготовил некоторый код для инвертирования шестнадцатеричных символов вокруг как части забавного осуществления, которое я составил.

Вот то, что я имею в данный момент:

#include <stdio.h>  
int main() {  
    char a,b,c;  
    while (1) {  
        c = getchar();  
        if (!feof(stdin)) {  
            a = c % 16;  
            b = (c - a) / 16;  
            c = (a*16) + b;  
            putchar(c);  
        }else{break;}  
    }  
return 0;  
}  

Это работает хорошо на большинство значений. Например, 0xA0 становится 0x0A и т.д...

Однако это не играет хорошо с началом значений с 'F'.

0xF1 становится 0x10
0xFF становится 0xF0
и т.д...

Кто-то может указать на меня в правильное направление?

6
задан Pete Kirkham 14 February 2010 в 10:51
поделиться

4 ответа

Вы используете подписанный (на вашем компьютере) тип данных. Переключите его на неподписанный, и он должен работать правильно.

5
ответ дан 9 December 2019 в 20:43
поделиться

Статические переменные являются общими для всех экземпляров типа.

константные переменные специфичны для каждого отдельного экземпляра типа, но их значения известны и фиксированы во время компиляции, и их нельзя изменить во время выполнения.

в отличие от констант, значения статических переменных могут быть изменены во время выполнения.

-121--971473-

Можно использовать функцию time модуля strptime () :

import time
date = input('Date (mm/dd/yyyy): ')
try:
  valid_date = time.strptime(date, '%m/%d/%Y')
except ValueError:
  print('Invalid date!')

Обратите внимание, что в Python 2 .x необходимо использовать raw _ input вместо input .

-121--1736540-

Если символ подписан в вашей системе, то если верхняя кромка c равна f, c отрицательна, а c% 16 даст отрицательный результат.

7
ответ дан 9 December 2019 в 20:43
поделиться

Я не знаю, почему кто-то выполняет операции *, /,%, в то время как простые побитовые операции могут делать такие вещи.

a = (c & 0x0F) << 4;
b = (c & 0xF0) >> 4;
c = a | b;

0
ответ дан 9 December 2019 в 20:43
поделиться

getchar и putchar возвращают и принимают int s. Даже лучше, чем это, они используют значение char , приведенное к unsigned char , что означает, что для всех допустимых символов putchar вернет положительное значение. Это необходимо для вашего алгоритма, поскольку вы используете % , и в противном случае вам пришлось бы полагаться на поведение, определяемое реализацией.

Если вы присвоите значение getchar int , то вы можете проверить, не удалось ли чтение по какой-либо причине (а не только в конце потока), сравнив его с EOF. Тогда использование feof не обязательно - раньше этого было недостаточно.

Например.

int main(void) {  
    int c;  
    while ((c = getchar()) != EOF) {  
        /* algorithm goes here */
        putchar(c);  
    }  
    return 0;  
}
0
ответ дан 9 December 2019 в 20:43
поделиться
Другие вопросы по тегам:

Похожие вопросы: