Bitové rotace a posuny(Extrakce osmi bitů z 24 bit hodnoty)   zodpovězená otázka

Algoritmy, .NET

Dobrý den,

mám následující konstantu :

Const Barva As UInteger = &HFFCCFF

a potřeboval bych zjistit hodnotu prostředních osmi bitů(zelená barevná složka).

Jak na to?Vlastně potřebuji obecny postup jak z N bitové hodnoty vytahnout M bitů z pozice p.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Dobrý den,

třeba takto:

Const Barva As UInteger = &HFFCCFF
Dim ccc As Color = Color.FromArgb(Barva)
Dim zelena As Byte = ccc.G

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Ano to taky funguje.

Ono to funguje i takhle :

x = (Barva - (Barva \ &H10000) * &H10000) \ &H100 

ale asi jsem se vyjádřil špatně. Potřebuji obecný způsob jak z N bitové hodnoty vytáhnout M bitů z pozice p. Řekl bych že se to bude realizovat bit. posuny, nicméně jsem je ve .Netu nepoužil. No vlastně nikdy jsem bity neposouval ani nerotoval.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Nedokážu Vám poradit přesnou syntaxi v VB, ale způsob, jak na to, ano. V jazyce C by to vypadalo takto:

#include <stdio.h>

// input - vstupni sekvence bitu
// N - pocet bitu v sekvenci
// p - pozice, od ktere se maji vratit bity
// m - pocet bitu, ktere chci vratit
int getBits(int input, int p, const int N, const int m)
{
	int i;
	int output = 0;
	
	for (i = N - 1; i >= 0; i--)
	{
		if (i < N - p && i >= (N - (p + m)))
		{
			output |= (1 << i) & input;
		}
	}
		
	output = output >> (N - (p + m));
	return output;	
}


int main()
{
	printf("%d", getBits(0b1101110111, 5, 10, 3));
	return 0;
}

V ukázce předávám do funkce getBits sekvence 1101110111, dále říkám, že chci bity od páté pozice (počítáno od nuly), délka sekvence je 10 a chci vrátit 3 bity. Požaduji tedy výstup 101. Funkce vrátí číslo 5, což po převedení do binární soustavy je opravdu 101.

Jestli tohle přepíšete do VB (asi to bude podobné, ale opravdu nevím), mělo by to fungovat.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Řešil jsem tu kdysi přístup k jednotlivým bitům.

http://www.vbnet.cz/forum-tema--3346-int...

A co se týče čtení bytů z nějaké hodnoty, na to je BitConverter.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Děkuju pomohlo ale

docela mě překvapuje jak všichni tahají kanón na mouchu přitom stačí následující kód!

Zelena = (barva And &H00FF00) >> 8

A dostanu požadovaného výsledku.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

"Tahají kanón na mouchu" preto, lebo ste sa pýtal na obecný spôsob, ako danú vec urobiť. Váš kód je síce niekoľkokrát kratší, avšak je fixovaný na jednu jedinú možnosť.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback