Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

подчеркнутых цифрах поменять местами младший и старший биты

86K
13 ноября 2012 года
Юлечка Лобанова
1 / / 13.11.2012
даны два int числа: N1 = ABCD и N2 = EFGH, где AB…GH – 16 – ричные цифры. Образовать long число BCDABCDE, используя только поразрядные операции. В подчеркнутых цифрах поменять местами младший и старший биты.( подчеркнутые цифры :первая буква В, буква А, и последняя буква 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);
}
Мне уже дали совет, как сделать 2 часть, но не получается разобраться и не запускается, подскажите, если сможете.
Код:
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);
}
int main()
{ ....
n = exchangebits( n, 7);
n = exchangebits( n, 4);
n = exchangebits( n, 1);
.....
}
12K
14 ноября 2012 года
Ghox
297 / / 26.07.2009
Цитата:
и N2 = EFGH, где AB…GH – 16 – ричные цифры.



В стандартном 16-ричном наборе нет цифр G и H. Последняя цифра - F, которая соответствует 15 в десятичной системе.

Шестнадцатеричная система счисления

412
14 ноября 2012 года
grgdvo
323 / / 04.07.2007
Цитата: Ghox
Цитата:
и N2 = EFGH, где AB…GH – 16 – ричные цифры.


В стандартном 16-ричном наборе нет цифр G и H. Последняя цифра - F, которая соответствует 15 в десятичной системе.


Я думаю ТС понимает, что это так... Просто из задания написано, что, типа, числа произвольные.

Осмелюсь на память "навоять". Думается, нужно три базовые операции: узнать значение произвольного бита в целом (GETBIT), установить произвольный бит в целом (SETBIT) и сбросить произвольный бит в целом (CLRBIT). Запишем их

 
Код:
long GETBIT(long value, unsigned int bitnum) {
  return ((value & (1 << bitnum)) >> bitnum);
}
long SETBIT(long value, unsigned int bitnum) {
  return (value & (~(1 << bitnum)));
}
long CLRBIT(long value, unsigned int bitnum) {
  return (value | (1 << bitnum));
}
Остается написать алгоритм обмена, указывая нужные биты:

 
Код:
long SWAPBIT(long value, unsigned int abitnum, unsigned int bitnum)
{
  long abitvalue = GETBIT(value, abitnum);
  long bbitvalue = GETBIT(value, bbitnum);
  if (abitvalue) value = SETBIT(value, bbitnum) else value = CLRBIT(value, bbitnum);
  if (bbitvalue) value = SETBIT(value, abitnum) else value = CLRBIT(calue, abitnum);
  return value;
}
Далее

 
Код:
value = SWAPBIT(value, 28, 31); // первое B
value = SWAPBIT(value, 16, 19); // буква A
value = SWAPBIT(value, 4, 7); // последняя D
Простите, если где накосячил
11K
15 ноября 2012 года
xAtom
65 / / 17.01.2011
Подчёркнутые тетрады вслепую указывать их позиции, или надо было бы линейный поиск делать ?

Код:
// первое задание
#define LONGNUM(a, b) \
(((a & 0xFFFL) << 4L) | ((a & 0xF000L) >> 12L)) << 16L | \
(((a & 0xFFFL) << 4L) | ((b & 0xF000L) >> 12L))

// второе задание
inline long SWAP(long n, long p) {
   long t = (n >> p) & 0xFL;
   long d = ((t & 0x1) << 3L) | ((t & ~0x8) & ~0x1) | (t >> 3L);
   return (n & ~(t << p)) | (d << p);
}


int main()
{
  long n = LONGNUM(0xABCD, 0xE123);
  n = SWAP(n, 28L); // путь вслепую после того как увидел позицию в двойном слове.
  printf("0x%lX\n", n);
  return 0;
}
85K
15 ноября 2012 года
Ustus
6 / / 04.10.2012
Может, достаточно просто
 
Код:
long bitxchg( long n )
{
    return
        n      & 0x6FF6FF6F
      | n >> 3 & 0x10010010
      | n << 3 & 0x80080080;
}
?
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог