Вернуть другое число, в котором переставлены местами биты в четверках - C (СИ)

Узнай цену своей работы

Формулировка задачи:

Нужно написать функцию которая по заданному типу Integer возвращает другое число в котором переставлены местами биты в четверках.
Пример работы: Enter number : 163 You entered: 163 = 0xA3 = 10100011 Result: 92 = 0x5c = 01011100
#include <stdio.h>
#include <string.h>
 
typedef unsigned char Integer;
//typedef unsigned short Integer;
//typedef unsigned int Integer;
//typedef unsigned long Integer;

Integer Bin(const Integer number) // перевод в двоичную
{
    int i,j,len;
    const Integer  *num;
 
    len = sizeof(Integer)-1;
    num = &number;
    for (i = len; i >= 0; i--)
        for (j = 7; j >= 0; j--)
            printf("%i", (num[i] >> j) & 1);
    
}
 
Integer reverseBit(const Integer number) //реверс битов
{
    int i, j, len;
    const Integer  *num;
 
    len = sizeof(Integer)-1;
    num = &number;
    for (i = len; i >= 0; i--)
    for (j = 7; j >= 0; j--)
        printf("%i", ~(num[i] >> j) & 1);
 
}
 
Integer reverse(const Integer number) //реверс и представление в десятичной
{
    int i, j, len;
    const Integer  *num;
 
    len = sizeof(Integer)-1;
    num = &number;
    for (i = len; i >= 0; i--)
    for (j = 7; j >= 0; j--)
        printf("%i", ~(num[i] >> j) );
 
}
 
int main(void) {
 
    Integer count;
 
    while (printf("Enter count: ") && scanf("%i", &count) == 1){
 
        printf("You entered : %i =  0x%0x =  ", count,count );
        Bin(count);
        printf(" \n");
        printf("Result : ");
        reverse(count);
        printf(" \n");
        
    }
    return 0;
}
Для всех типов, кроме unsigned char спереди появляются нули.
printf("%i", (num[i] >> j) & 1)   //пытался добавить сюда &255, но выдает ошибку;
Вместо числа в десятичной (с поменяными битами ) выводит чушь. Вроде бы все так, но не понимаю почему не работает.

Решение задачи: «Вернуть другое число, в котором переставлены местами биты в четверках»

textual
Листинг программы
#include <stdio.h>
 
unsigned char reverce4 (unsigned char n) {
 unsigned char halfs[]={
  0,8,4,12, 2,10,6,14, 1,9,5,13, 3,11,7,15
 };
 return (halfs[(n&0xF0)>>4]<<4)|halfs[n&0x0F];
}
 
int main () {
 int n=163,n2=reverce4 (n);
 printf ("\n%d (%X) -> %d (%X)",n,n,n2,n2);
 getchar();
 return 0;
}

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

15   голосов , оценка 4.133 из 5
Похожие ответы