// первое задание
#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;
}
подчеркнутых цифрах поменять местами младший и старший биты
Код:
#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);
}
#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);
}
int main()
{ ....
n = exchangebits( n, 7);
n = exchangebits( n, 4);
n = exchangebits( n, 1);
.....
}
{
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);
.....
}
В стандартном 16-ричном наборе нет цифр G и H. Последняя цифра - F, которая соответствует 15 в десятичной системе.
Шестнадцатеричная система счисления
Цитата: Ghox
Я думаю ТС понимает, что это так... Просто из задания написано, что, типа, числа произвольные.
Осмелюсь на память "навоять". Думается, нужно три базовые операции: узнать значение произвольного бита в целом (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));
}
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;
}
{
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
value = SWAPBIT(value, 16, 19); // буква A
value = SWAPBIT(value, 4, 7); // последняя D
Подчёркнутые тетрады вслепую указывать их позиции, или надо было бы линейный поиск делать ?
Код:
long bitxchg( long n )
{
return
n & 0x6FF6FF6F
| n >> 3 & 0x10010010
| n << 3 & 0x80080080;
}
{
return
n & 0x6FF6FF6F
| n >> 3 & 0x10010010
| n << 3 & 0x80080080;
}