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

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

Войти
Регистрация
Восстановить пароль
 
Dimarik__
21 / 21 / 1
Регистрация: 29.04.2010
Сообщений: 444
#1

Работа с битами - в файл записывается не то, что нужно - C++

08.03.2011, 16:05. Просмотров 559. Ответов 2
Метки нет (Все метки)

собственно что хочу сделать....
Пусть b[i] - каждый бит байта a.val
b[i] ^= b[(i+4)%8] ^ b[(i+5)%8] ^
b[(i+6)%8] ^ b[(i+7)%8] ^ c;
где с для i равного 0,1,5,6 будет 1, для остальных 0.
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
49
50
// побитовые_операции.cpp : Defines the entry point for the console application.
//
 
#include "stdafx.h"
#include <iostream>
 #include <fstream> 
using namespace std;
 
union DATA {
    struct {
        unsigned b[8];
    };
    unsigned char val;
};
 
int _tmain(int argc, _TCHAR* argv[])
{
    union DATA a;
    unsigned char  cArray[256];
    int rr = sizeof(unsigned char);
    fstream out;
    out.open("t.txt",ios::out);
    for (int i = 0; i < 256; i++)
        cArray[i] = i;
    /*собственно что хочу в цлике сделать....
    Пусть b[i] - каждый бит байта a.val
    b[i] ^= b[(i+4)%8] ^ b[(i+5)%8] ^ 
    b[(i+6)%8] ^ b[(i+7)%8] ^ c;
    где с для i равного 0,1,5,6 будет 1, для остальных 0.
    */
    for (int i = 0; i < 256; i++)
    {
        a.val = cArray[i];
        for (int j = 0; j < 8; j++)
        {
            a.b[j] ^= a.b[(j+4)%8] ^ a.b[(j+5)%8]
                ^ a.b[(j+6)%8] ^ a.b[(j+7)%8];
            if ((j == 0) || (j == 1) || (j == 5) || (j == 6))
                a.b[j] ^= 1;
            else
                a.b[j] ^= 0;
            
        }
        out<<(int)a.val<<" ";
    
    }
    out.close();
    system ("pause");
    return 0;
}
в результате какая-то бредятина в файл записывается.
P.S. я не очень разобрался как работает этот union, то есть записывается в val, а потом побитово в b[i]???
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
08.03.2011, 16:05
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Работа с битами - в файл записывается не то, что нужно (C++):

Курсовая работа. В файл *.txt не записывается текст - C++
В общем, в файл *.txt не записывается текст, который напечатан после пробела. Вот скрины: Очень нужна помощь... Заранее,...

Работа с битами И Работа с символьными данными - C++
1. Ввести 8 символов. В символе с наибольшим кодом заменить 5-й бит единицей, а в символе с наименьшим кодом 6-й бит - нулем. Вывести...

Работа с битами - C++
три раза писал но все равно не получается((( 1-)Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если...

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

Работа с битами - C++
Не могу понять, почему не правильно работает программа. Программа зашифровывает строку, выводит, потом расшифровывает и выводит. ...

Работа с битами. - C++
Здрасте. Дана задача: Определить на сколько в числе А больше значущих битов, что равны единице, чем битов, что равны нулю. Помогите...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Mycola
22 / 12 / 13
Регистрация: 23.03.2013
Сообщений: 157
13.07.2014, 00:05 #2
нужно доделать но то что хотели, я зделал

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
49
50
51
52
53
54
55
#include <iostream>
#include <fstream> 
using namespace std;
 
struct DATA {
            unsigned b[8];
            unsigned char val;
            } a;
 
int main()
{
    //struct DATA a;
    unsigned char  cArray[256];
    int rr = sizeof(unsigned char);
    fstream out;
    out.open("t.txt", ios::out);
    bool c;
 
    // и нужно чем то заполнить a.val перед операциями над ним
    for (int i = 0; i < 256; i++)
    {
        cArray[i] = i;
        for (int j = 0; j < 8; j++)
        {
            if ((j == 0) || (j == 1) || (j == 5) || (j == 6))
            {
                c = true;
            }
            else
            {
                c = false;
            }
            a.b[j] = (a.val &(j << 1));
            a.b[j] ^= a.b[(j + 4) % 8] ^ a.b[(j + 5) % 8] ^ a.b[(j + 6) % 8] ^ a.b[(j + 7) % 8] ^ c;
        }
    }
        for (int i = 0; i < 256; i++)
        {
            a.val = cArray[i];
            for (int j = 0; j < 8; j++)
            {
                a.b[j] ^= a.b[(j + 4) % 8] ^ a.b[(j + 5) % 8]
                    ^ a.b[(j + 6) % 8] ^ a.b[(j + 7) % 8];
                if ((j == 0) || (j == 1) || (j == 5) || (j == 6))
                    a.b[j] ^= 1;
                else
                    a.b[j] ^= 0;
 
            }
            out << (int)a.val << " ";
        }
        out.close();
        //system("pause");
        return 0;
    }
0
ValeryS
Модератор
6634 / 5041 / 466
Регистрация: 14.02.2011
Сообщений: 16,852
13.07.2014, 00:17 #3
Цитата Сообщение от Dimarik__ Посмотреть сообщение
P.S. я не очень разобрался как работает этот union, то есть записывается в val, а потом побитово в b[i]???
в именно твоем вообще трудно разобраться
вот например это что
Цитата Сообщение от Dimarik__ Посмотреть сообщение
unsigned b[8];
если ты думаешь что это 8 бит то ошибаешься это массив из 8 int которые беззнаковые
чисто с битами Си работать не умет
но есть такая штука битовые поля называются
http://ru.wikipedia.org/wiki/Битовое_поле
http://www.c-cpp.ru/books/bitovye-polya
может поможет

тогда твой union может выглядеть например так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
union DATA {
    struct bp{
        unsigned b0:1;
        unsigned b1:1;
        unsigned b2:1;
        unsigned b3:1;
        unsigned b4:1;
        unsigned b5:1;
        unsigned b6:1;
        unsigned b7:1;
    };
    unsigned char val;
}
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2014, 00:17
Привет! Вот еще темы с ответами:

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

Работа с битами - C++
Стоит задача: вывести все двоичные коды чисел от 0 и до 2n-1. Сделать напролом могу(переводить в цикле каждое число в двоичную с-му и...

Работа с битами - C++
Я уже задолбался... :wall: Может мне кто нибудь подскажет как из 00111010 (58) получить 00001010 (10) хотя бы каким методом... код...

Работа с битами. - C++
помогите!! как писать эту на программе с++ Ввести последовательность из 8 символов. Сравнить 5-й и 6-й биты каждого символа. Если они...


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

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

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