Страница 1 из 1

Builder C++ Поразрядные операции

Добавлено: 19 ноя 2012, 17:35
юляшка1
помогите пожалуйста дописать 2 часть программы. 26. Даны два int-числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long-число BCDABCDE, используя только поразрядные операции. В подчеркнутых цифрах поменять местами младший и старший биты.( подчеркнуты символы :( первый- первая B,четвертый- A, и предпоследний -D в long-числе BCDABCDE)

Код: Выделить всё

#include <stdio.h>
#include <math.h>
#include <conio.h>
long num(int n1, int n2);

int main()
{
        int n1, n2;
        long n;
        printf("\nRabota 8. Porazradnie operacii\n");
        printf("Input two numbers n1 and n2: \t");
        scanf("%x%x", &n1, &n2);
        n = num(n1, n2);
        printf("n = %lx\n", n);
        getch();
        return 0;
}

long num(int n1, int n2)
{
        long n=0x0, BCD, A, E;
        BCD = n1 & 0xFFF;
        A = (n1 >>12) & 0xF;
        E = (n2 >> 12) & 0xF;
        n = n | (BCD << 4*5);
        n = n | (A << 4*4);
        n = n | (BCD << 4);
        n = n | E ;
        return (n);
}
посоветовали использовать код, который я приведу ниже, но с ним не могу разобраться, программа не работает.

Код: Выделить всё

long getnum(  long n, int position)
{
  return (n >> (4*position)) & 0xfu;
}
long setnum(long n,long num, int position)
{
  long mask = ((long) 0xfu) << (4 * position);
  n &= ~mask;
  return n | ((num & 0xfu) << (4 * position));
}
long resetbits( long n )
{
  int bit0 = (n & 0x1u) != 0;
  int bit3 = (n & 0x8u) != 0;
  if( bit0 != bit3 )
  {
    n &= 0x6u;  /* 0110 */
    if( bit0) n |= 0x8u; /* 1000 */
    if( bit3) n |= 0x1u; /* 0001 */
  }
}
long exhangebits(  long n, int position)
{
  long num = getnum( n, position);
  num =  resetbits( num );
  return setnum( n,  num, position);
}
{...
  n = exchangebits( n, 7);
  n = exchangebits( n, 4);
  n = exchangebits( n, 1);
...
}