Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Генри
12 / 12 / 2
Регистрация: 19.08.2012
Сообщений: 51
#1

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

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

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

зеркально отобразить столбец в массиве - C++
Нужно зеркально отобразить столбец в массиве есть подпрограма в которой нужно перевернуть столбцы содержащие хотя бы одно отрицательное...

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

Зеркально отобразить массив, по главной диагонали - C++
Набросал вот такой вот код, и никак не могу сделать алгоритм, для зеркального отображения массива. Нашел в инете подобную задачу, с...

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

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

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

18
Jupiter
Каратель
Эксперт С++
6556 / 3977 / 227
Регистрация: 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
16133 / 10411 / 1549
Регистрация: 24.12.2010
Сообщений: 19,712
19.08.2012, 23:29 #4
C
1
2
int in = 0xAC;
int out = ~in;
Операция ~ заменяет все биты противоположными 0 -> 1, 1->0

Добавлено через 2 минуты
Прошу прощения. Можно было подозревать, что не я один вцеплюсь в этот сладкий вопрос
0
Генри
12 / 12 / 2
Регистрация: 19.08.2012
Сообщений: 51
19.08.2012, 23:32  [ТС] #5
Именно тетрады. Ведь операция инверсии ~ превратит вектор 0110 в 1001, а он должен быть 0110, зеркально отображен. Или я не правильно понял?
0
alkagolik
Заблокирован
19.08.2012, 23:34 #6
Генри, наверное следует четко поставить свою задачу и разкрыть понятие "зеркальное отображение"
0
Генри
12 / 12 / 2
Регистрация: 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
~ Эврика! ~
1244 / 993 / 42
Регистрация: 24.07.2012
Сообщений: 2,002
19.08.2012, 23:54 #8
Я понял!
11101100
11101100
01110011
01110011
0
Генри
12 / 12 / 2
Регистрация: 19.08.2012
Сообщений: 51
19.08.2012, 23:59  [ТС] #9
Да, именно так, только как это сделать?
0
OhMyGodSoLong
~ Эврика! ~
1244 / 993 / 42
Регистрация: 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
бжни
2447 / 1652 / 84
Регистрация: 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
бжни
2447 / 1652 / 84
Регистрация: 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
бжни
2447 / 1652 / 84
Регистрация: 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
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
20.08.2012, 01:41
Привет! Вот еще темы с ответами:

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
15
Yandex
Объявления
20.08.2012, 01:41
Ответ Создать тему
Опции темы

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