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

Битовые поля - C++

Восстановить пароль Регистрация
 
Usefur
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 74
07.11.2010, 19:19     Битовые поля #1
Народ, напишите программу для включения 3-го разряда однобайтового числа и переключения 7-го. Никак не понимаю что и как...Напишите пож..
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
07.11.2010, 19:19     Битовые поля
Посмотрите здесь:

C++ Битовые поля
C++ Битовые поля
Битовые поля C++
Битовые операции, битовые поля. C++
C++ Битовые поля
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
KpeHDeJIb
 Аватар для KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
07.11.2010, 19:45     Битовые поля #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
#include <stdio.h>
 
typedef unsigned char uchar;
 
typedef union
{
    uchar value;
 
    struct
    {
        uchar b1 : 1;
        uchar b2 : 1;
        uchar b3 : 1;
        uchar b4 : 1;
        uchar b5 : 1;
        uchar b6 : 1;
        uchar b7 : 1;
        uchar b8 : 1;
    };
} Byte;
 
int main()
{
    Byte byte;
 
    byte.value = 0x00;
    printf("byte = 0x%02X\n", byte.value);
 
    byte.b3 = 1;
    printf("byte = 0x%02X\n", byte.value);
 
    byte.b7 = !byte.b7;
    printf("byte = 0x%02X\n", byte.value);
 
    byte.b7 = !byte.b7;
    printf("byte = 0x%02X\n", byte.value);
 
    return 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
#include <stdio.h>
 
#define BIT1 0x01
#define BIT2 0x02
#define BIT3 0x04
#define BIT4 0x08
#define BIT5 0x10
#define BIT6 0x20
#define BIT7 0x40
#define BIT8 0x80
 
typedef unsigned char byte;
 
int main()
{
    byte value = 0x00;
    printf("byte = 0x%02X\n", value);
 
    value |= BIT3;
    printf("byte = 0x%02X\n", value);
 
    value ^= BIT7;
    printf("byte = 0x%02X\n", value);
 
    value ^= BIT7;
    printf("byte = 0x%02X\n", value);
 
    return 0;
}
Добавлено через 4 минуты
Кстати, насчет битовых полей, вспомнил одну штуку - в MSVC битовые поля для разных типов данных не сжимаются, в отличии от gcc, поэтому если хочешь чтобы несколько подряд идущих битовых полей занимали непрерывный участок памяти - лучше всегда использовать один тип данных, как в первом примере выше.
Usefur
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 74
07.11.2010, 19:54  [ТС]     Битовые поля #3
Омг, спасибо..но зачем так сложно. Попроще, чтото например этого:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include<stdio.h> /* mask_stru */
int main(void)
{unsigned int i=18;
 unsigned char c;
struct
  {unsigned mask: 2;}s;
   s.mask=02;
 printf("\n");
 i<<=8; i+=17;
 c=i;
 printf("i<<=8+17= %x  i1=%d  i2=%d\n", i, c, i>>8);
 printf("   Ввiмкнення 2-го розряду: %d  %d\n", c  |    s.mask, i>>8  |    s.mask);
 printf("    Вимкнення 2-го розряду: %d  %d\n", c & ~s.mask, i>>8 & ~s.mask);
 printf("Перемикання 2-го розряду: %d  %d\n", c ^    s.mask, i>>8 ^    s.mask);
 getch();
return(0);
}
Но тут много лишнего...


По принципу, но как записать полную программу?
C
1
2
3
4
5
unsigned char chg(unsigned char x) {
x |= (1 << 3);
x ^= (1 << 7);
return x;
}
Добавлено через 1 минуту
Тоесть результат примерно:

Включение 3-го розряда: 19 18
Переключение 7-го розряда: 19 16
KpeHDeJIb
 Аватар для KpeHDeJIb
56 / 56 / 3
Регистрация: 31.10.2010
Сообщений: 103
07.11.2010, 19:58     Битовые поля #4
Цитата Сообщение от Usefur Посмотреть сообщение
Попроще, чтото например этого:
Лол, попроще ) Если тебе надо установить 3ий разряд и переключить 7ой (разряды нумеруем с 0), то тогда будет вот так:
C
1
x = (x | 0x08) ^ 0x80;
А выше я тебе дал два варианта, один с битовыми полями, другой с заранее заданными константами. Если для тебя это слишком сложно, увы и ах.
Prividenie
74 / 74 / 6
Регистрация: 05.10.2008
Сообщений: 233
07.11.2010, 20:48     Битовые поля #5
Цитата Сообщение от Usefur Посмотреть сообщение
По принципу, но как записать полную программу?
C
1
2
3
4
5
unsigned char chg(unsigned char x) {
x |= (1 << 3);
x ^= (1 << 7);
return x;
}
а чем вас ваш вариант не устроил который вы привели?
//i |= 0b00001000;
i|=(1<<3);
//i ^= 0b1000000;
i^=(1<<7);
Usefur
0 / 0 / 0
Регистрация: 15.09.2010
Сообщений: 74
07.11.2010, 22:02  [ТС]     Битовые поля #6
Разобрался, спасибо.
Yandex
Объявления
07.11.2010, 22:02     Битовые поля
Ответ Создать тему
Опции темы

Текущее время: 16:33. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru