Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Генри
12 / 12 / 4
Регистрация: 19.08.2012
Сообщений: 51
#1

Зеркально отобразить тетрады - C++

19.08.2012, 23:23. Просмотров 1054. Ответов 18
Метки нет (Все метки)

Как можно зеркально отобразить тетрады? К примеру 10101100 в 01010011. На с++ я пропустил эту тему и не совсем овладел этими операциями. Можете подсказать или немного наставить информацией?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
19.08.2012, 23:23
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Зеркально отобразить тетрады (C++):

зеркально отобразить столбец в массиве
Нужно зеркально отобразить столбец в массиве есть подпрограма в которой нужно...

Отобразить матрицу зеркально справа налево
Дана квадратная матрица натуральных чисел, (получаемая через rand())....

Как в C++ зеркально отобразить байты в переменной.
Задача состоит в следующем, после чтения с бинарного файла в переменную...

Зеркально отобразить массив, по главной диагонали
Набросал вот такой вот код, и никак не могу сделать алгоритм, для зеркального...

Отобразить элементы матрицы зеркально сверху вниз
Дана квадратная матрица (задаётся через rand()) Отобразить зеркально сверху...

Отобразить верхнюю половину матрицы на нижнюю зеркально симметрично
Заполнить матрицу случайными числами. Отобразить верхнюю половину матрицы на...

18
Jupiter
Каратель
Эксперт С++
6568 / 3989 / 400
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
19.08.2012, 23:27 #2
Цитата Сообщение от Генри Посмотреть сообщение
К примеру 10101100 в 01010011
C++
1
a = ~a;
0
alkagolik
Заблокирован
19.08.2012, 23:27 #3
Генри, именно тетрады? весь тип инвертируется с помощью операции инверсии ~
0
Байт
Эксперт C
17769 / 11794 / 2450
Регистрация: 24.12.2010
Сообщений: 23,716
19.08.2012, 23:29 #4
C
1
2
int in = 0xAC;
int out = ~in;
Операция ~ заменяет все биты противоположными 0 -> 1, 1->0

Добавлено через 2 минуты
Прошу прощения. Можно было подозревать, что не я один вцеплюсь в этот сладкий вопрос
0
Генри
12 / 12 / 4
Регистрация: 19.08.2012
Сообщений: 51
19.08.2012, 23:32  [ТС] #5
Именно тетрады. Ведь операция инверсии ~ превратит вектор 0110 в 1001, а он должен быть 0110, зеркально отображен. Или я не правильно понял?
0
alkagolik
Заблокирован
19.08.2012, 23:34 #6
Генри, наверное следует четко поставить свою задачу и разкрыть понятие "зеркальное отображение"
0
Генри
12 / 12 / 4
Регистрация: 19.08.2012
Сообщений: 51
19.08.2012, 23:51  [ТС] #7
Вот код, который я пока сделал

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
#include "stdafx.h"
#include <iostream>
#include <conio.h>
#include <Windows.h>
#include <stdio.h>
#include <string.h>
using namespace std;
 
#define UI unsigned int
 
void Вывод_вектора(UI x, int i)
{
    UI mask; 
    for(mask=1<<(i-1);mask;mask>>=1)
        if(mask&x) cout<<'1';
        else cout<<'0';
 
}
 
void main()
{
    SetConsoleCP(1251);
    SetConsoleOutputCP(1251);
    UI x, i; char s[33];
    cout<<"Введите двоичный вектор: "<<endl;
    gets_s(s);
    for(i=x=0;s[i]!='\0';i++)
        {
            x<<=1;
            if(s[i]=='1') x=x|1;
        }
        while((i%4)!=0)
            i++;
    cout<<endl<<"Ваш вектор: "<<endl;
    Вывод_вектора(x,i);
 
    _getch();
}
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
19.08.2012, 23:54 #8
Я понял!
11101100
11101100
01110011
01110011
0
Генри
12 / 12 / 4
Регистрация: 19.08.2012
Сообщений: 51
19.08.2012, 23:59  [ТС] #9
Да, именно так, только как это сделать?
0
OhMyGodSoLong
~ Эврика! ~
1245 / 994 / 74
Регистрация: 24.07.2012
Сообщений: 2,002
20.08.2012, 00:07 #10
Грязнорешение для байтов.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <iostream>
 
const size_t bitsInChar = 8;
 
std::string toBinary(unsigned char num)
{
  std::string result(bitsInChar, '0');
  for (int i = bitsInChar - 1; i >= 0; --i) {
    result[i] = (num & 1) ? '1' : '0';
    num >>= 1;
  }
  return result;
}
 
unsigned char flip(unsigned char num)
{
  return (num & 0x11) << 3
       | (num & 0x22) << 1
       | (num & 0x44) >> 1
       | (num & 0x88) >> 3;
}
 
int main()
{
  std::cout << toBinary(0xEC) << std::endl;
  std::cout << toBinary(flip(0xEC)) << std::endl;
}
2
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
20.08.2012, 00:23 #11
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define GET_BIT(value, bit_number) ((value) & (1 << (bit_number)) ? 1 : 0)
 
void print_b (unsigned bin) {
  unsigned i;
  for (i = sizeof(bin) * 8 ; i ; --i) {
    printf ("%u", GET_BIT(bin, i - 1));
  }
  printf ("\n");
}
 
int main () {
  unsigned old = 236, new;
  new = (old & 0xF) << 4 | (old & 0xF0) >> 4;
  print_b (old);
  print_b (new);
}
1
alkagolik
Заблокирован
20.08.2012, 00:37 #12
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
unsigned mirror_quat (unsigned num) {
    unsigned i, res = 0, shr = 0;
 
    while(num) {
        i = 4;
 
        while ( i ) {
            res = ( ( res >> shr >> (i - 1)) | num & 1 ) << ( i -1 ) << shr;
            num >>= 1;
            --i;
        }
        shr += 4;
    }
    return res;
}
hex test
src_num mirror_num
0 0
1 8
2 4
3 c
4 2
5 a
6 6
7 e
8 1
9 9
a 5
b d
c 3
d b
e 7
f f
Добавлено через 6 минут
alex_x_x, хех, крутяк взял и функцию вывел.

Добавлено через 8 минут
alex_x_x, нет, не работает твоя функция.
моя тоже на разных тестах валится.
1
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
20.08.2012, 01:26 #13
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

alkagolik, на каких?

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define GET_BIT(value, bit_number) ((value) & (1 << (bit_number)) ? 1 : 0)
#define SWAP_BYTE(b1, b2) do { byte tmp; tmp = b2; b2 = b1; b1 = tmp; } while (0)
 
typedef unsigned char byte;
 
void print_b (unsigned bin) {
  unsigned i;
  for (i = sizeof(bin) * 8 ; i ; --i) {
    printf ("%u", GET_BIT(bin, i - 1));
  }
  printf ("\n");
}
 
void shr_bytes (byte* left, byte* right) {
  byte b1 = *left & 0xF0 >> 4, b2 = *left & 0xF, b3 = *right & 0xF0 >> 4, b4 = *right & 0xF;
  *left  = b4 << 4 | b3;
  *right = b2 << 4 | b1; 
}
 
unsigned shr (unsigned value) {
  unsigned i;
 
  union {
    unsigned value;
    byte array [sizeof(value)];
  } result;
 
  result.value = value;
  for (i = 0; i < sizeof(unsigned) / 2 ; ++i) {
    shr_bytes (&result.array[i], &result.array[sizeof(unsigned) -i -1]);
  }
  
  return result.value;
}
 
int main () {
  unsigned old = 236, new = shr (old);
  print_b (old);
  print_b (new);
}
вроде теперь православно
0
alkagolik
Заблокирован
20.08.2012, 01:30 #14
Лучший ответ Сообщение было отмечено Памирыч как решение

Решение

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>
 
unsigned mirror_quat (unsigned num) {
    unsigned res = 0, tmp;
    unsigned char shl = 0, i;
 
    while(num) {
        i = 4;
        tmp = 0;
        while ( i ) {
            tmp <<= 1;
            tmp |= num & 1;
            num >>= 1;
            --i;
        }
        res |=  tmp << shl;
        shl += 4;
    }
    return res;
}
 
int main() {
 
    fprintf( stdout, "%X %X\n", 0x12487A35, mirror_quat( 0x12487A35 ));
 
    return 0;
}
0
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
20.08.2012, 01:41 #15
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
 
#define GET_BIT(value, bit_number) ((value) & (1 << (bit_number)) ? 1 : 0)
#define SWAP_BYTE(b1, b2) do { byte tmp; tmp = b2; b2 = b1; b1 = tmp; } while (0)
 
typedef unsigned char byte;
 
void print_b (unsigned bin) {
  int i, j;
  for (i = sizeof(bin) - 1 ; i >= 0 ; --i) {
    for (j = 0 ; j < 8 ; ++j) {
      printf ("%u", GET_BIT(bin, i * 8 + j));
    }
    printf (" ");
  }
  printf ("\n");
}
 
void shr_bytes (byte* left, byte* right) {
  byte b1 = (*left & 0xF0) >> 4, b2 = *left & 0xF, b3 = (*right & 0xF0) >> 4, b4 = *right & 0xF;
 
  *left  = b4 << 4 | b3;
  *right = b2 << 4 | b1; 
}
 
unsigned shr (unsigned value) {
  unsigned i;
 
  union {
    unsigned value;
    byte array [sizeof(value)];
  } result;
 
  result.value = value;
  for (i = 0; i < sizeof(unsigned) / 2 ; ++i) {
    shr_bytes (&result.array[i], &result.array[sizeof(unsigned) - i - 1]);
  }
  
  return result.value;
}
 
int main () {
  unsigned old = 439508504, new = shr (old);
  print_b (old);
  print_b (new);
}
Bash
1
2
01011000 01001100 01111010 00011000
10000001 10100111 11000100 10000101
1
alkagolik
Заблокирован
20.08.2012, 01:49 #16
Цитата Сообщение от alex_x_x Посмотреть сообщение
01011000 01001100 01111010 00011000
10000001 10100111 11000100 10000101
это что?
~OhMyGodSoLong~, сообразил, просто и минимум операций. Я подогнал под беззнаковый целый тип и вот что вышло
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <stdio.h>
 
unsigned flip (unsigned num) {
    return (num & 0x11111111) << 3 |
            (num & 0x22222222) << 1 |
            (num & 0x44444444) >> 1 |
            (num & 0x88888888) >> 3;
}
 
int main() {
 
    fprintf( stdout, "%X %X\n", 0x12487A35, flip( 0x12487A35 ));
 
    return 0;
}
1
alex_x_x
бжни
2454 / 1660 / 134
Регистрация: 14.05.2009
Сообщений: 7,162
20.08.2012, 01:51 #17
alkagolik, я честно говоря уже запутался, что нужно было сделать
0
alkagolik
Заблокирован
20.08.2012, 01:56 #18
alex_x_x, по выходным позволительно надо каждую тетраду написать по еврейски - справа налево. Сделать так что 4й бит это 2^0, 3й бит 2^1 и т.д. и так с каждой тетрадой. при этом тетрады местами не менять. Короче я сам долго не мог понять. Чила 6, 9, F - остануться такими как и были, а остальные отобразятся зеркально - 1->8, 2->4, 4->2 и далее по тексту.
0
Генри
12 / 12 / 4
Регистрация: 19.08.2012
Сообщений: 51
20.08.2012, 10:45  [ТС] #19
Большое спасибо друзья.
0
20.08.2012, 10:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2012, 10:45
Привет! Вот еще темы с решениями:

Отобразить элементы заданной матрицы зеркально, по отношению к побочной диагонали
Помогите пожалуйста-- Дан двумерный массив. Отобразить зеркально, по отношению...

СЛОВА (не все предложение) отобразить зеркально и записать строкой во второй файл
Задача следующая: Имеется файл со строкой. Нужно СЛОВА (не все предложение)...

Отобразить левую половину матрицы на правую зеркально симметрично относительно вертикальной оси
Заполнить матрицу случайными числами.Отобразить левую половину матрицы на...

Отобразить правую половину матрицы на левую зеркально симметрично относительно вертикальной оси
Заполнить матрицу случайными числами. Отобразить правую половину матрицы на...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
19
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru