Bitový přístup k proměnné – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Bitový přístup k proměnné – C / C++ – Fórum – Programujte.comBitový přístup k proměnné – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Pavelv0
Stálý člen
12. 4. 2015   #1
-
0
-

Zdravím, šetřím místem a tak se snažím vytvořit nějakou proměnnou a té umožnit bitový přístup a ukládat tak třeba logickou hodnotu osmi různých stavů do charu.

Momentálně to mám takto:

char prom;
prom&=~0x04 - smazání bitu
prom|=0x04 - nastavení bitu

ale rád bych takovýto přístup:

prom.bit2 = 1;

zkoušel jsem typedef struct ale to mi vytvoří pouze další a další proměnné typu char a není to řešením mého problému.
 

Nahlásit jako SPAM
IP: 212.79.110.–
Reklama
Reklama
PiranhaGreg0
Stálý člen
13. 4. 2015   #2
-
+1
-
Zajímavé

   

Napadla mě taková šílenost, která funguje        

#include <iostream>

using namespace std;

union Val {
	template <int n> struct Bit {
		char val;

		inline void operator=(int x) {
			val |= !!x << n;
		}

		inline operator bool() const {
			return (val >> n) & 1; 
		}
	};

	Bit<0> bit1;
	Bit<1> bit2;
	Bit<2> bit3;
	Bit<3> bit4;
	Bit<4> bit5;
	Bit<5> bit6;
	Bit<6> bit7;
	Bit<7> bit8;
};

int main(void) {
	Val x;

	x.bit1 = 1;
	x.bit2 = 0;
	x.bit3 = 1;

	cout << "velikost: " << sizeof(x) << endl;
	cout << "bit1: " << x.bit1 << endl;
	cout << "bit2: " << x.bit2 << endl;
	cout << "bit3: " << x.bit3 << endl;

	return 0;
}

Proměnná x datového typu Val zabírá pouze jeden bajt  . 

velikost: 1
bit1: 1
bit2: 0
bit3: 1

Tím ale nechci říct, že je tohle řešení nějaký dobrý. V praxi bych se nebál trochu jiné syntaxe a použil makro. Nebo pokud ti jde o ukládání velkého množství bitů, je tu std::bitset  .

Nahlásit jako SPAM
IP: 109.81.210.–
Pavelv0
Stálý člen
13. 4. 2015   #3
-
0
-

Tohle ne, to je moc brutální, navíc bych raději zápis pro c, ale v krajním případě se spokojím i s c++

Nahlásit jako SPAM
IP: 147.228.95.–
ingiraxo+15
Grafoman
13. 4. 2015   #4
-
0
-

#1 Pavelv
já mám dojem, že děláš a chceš úplně něco jinýho

to první co si napsal, je běžný přiřazování flagů do proměnný

a to co chceš, je zase nastavovaní jednotlivých bitů do proměnných

můžeš to trohu rozvést, protože z toho cos napsal není poznat o co se vlastně pokoušíš

struct Bit
{
public:
    int& operator [] (const int& i) { return data[i + 1]; }
private:
    int data[8];
};

int main()
{
    Bit b;
    b[1] = 0; // nastavi 1.bit na 0
    b[2] = 1; // nastavi 2.bit na 1
    // ...
    b[8] = 1; // nastavi 8.bit na 1

    int bit2 = bit[2]; // ziska 2.bit

    return EXIT_SUCCESS;
}
Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
q
~ Anonymní uživatel
219 příspěvků
13. 4. 2015   #5
-
0
-

Na to je bit-field. V čistém C je povolen jen typ int a _Bool, ale msvc i gcc ti vezme i ten char apod.

typedef struct {
        _Bool bit0:1, bit1:1, bit2:1, bit3:1, bit4:1, bit5:1, bit6:1, bit7:1;
} bajt;

...

bajt b = { 0 };
b.bit0 = 1;
b.bit1 = 0;
Nahlásit jako SPAM
IP: 213.211.51.–
PiranhaGreg0
Stálý člen
13. 4. 2015   #6
-
0
-

#3 Pavelv
Ok, tady máš zápis pro C, který bych osobně asi používal. Případně si to můžeš ještě vyšperkovat nějakými makry... 

#include <stdio.h>

const unsigned char isFree = 0x01;
const unsigned char haveMultiplayer = 0x02;
const unsigned char isInCzech = 0x04;
const unsigned char isForLinux = 0x08;
const unsigned char haveOpenWord = 0x10;
const unsigned char haveCheats = 0x20;
const unsigned char haveDemo = 0x40;
const unsigned char isOpenSource = 0x80;

int main(void) {
	char Gothic = { 0 };

	Gothic |= isInCzech;
	Gothic |= haveOpenWord;
	Gothic |= haveCheats;
	Gothic |= haveDemo;

	if (Gothic & isFree)
		printf("Gothic je zdarma!\n");

	if (Gothic & haveOpenWord)
		printf("Gothic má otevřený svět!\n");

	Gothic &= ~haveDemo;

	if (Gothic & haveDemo)
		printf("Gothic má demo!\n");

	return 0;
}

Kód vypíše pouze hlášku s otevřeným světem...

Nahlásit jako SPAM
IP: 109.81.210.–
PiranhaGreg0
Stálý člen
Nahlásit jako SPAM
IP: 2a00:1028:9942:b69e:e821:...–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 111 hostů

Podobná vlákna

Bitový doplněk — založil Carduus

Bitový zápis, posun — založil crazy

Bitový string na int — založil Eva

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý