<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
		>
<channel>
	<title>Коментари на: Побитови операции</title>
	<atom:link href="http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/</link>
	<description>дневникът на Филип Петров</description>
	<lastBuildDate>Tue, 07 Feb 2012 14:50:41 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
	<item>
		<title>От: Филип Петров</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-11557</link>
		<dc:creator>Филип Петров</dc:creator>
		<pubDate>Wed, 22 Dec 2010 19:47:21 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-11557</guid>
		<description>Като ме върнахте на темата - ето нещо, което ми се наложи да пиша наскоро:

Често се използват при дефинирането на &quot;флагове&quot; (т.е. комбинация от опции, които в края на краищата искаме да видим дали са включени или не) - вместо огромно количество if-else или switch оператори, ние можем лесно да се ориентираме ако използваме побитови оператори, например:

final int op1 = 1; // 0001
final int op2 = 2; // 0010
final int op3 = 4; // 0100
final int op4 = 8; // 1000
... // други, степени на двойката
int settings = 0; // първоначално всичко изключено

Ако някой флаг бъде включен - просто добавяме неговата стойност към settings. Така съответния пореден бит за този флаг става 1. Обратно - при изключването изваждаме съответния флаг и бита му става 0. Така с една променлива изключително лесно виждаме кои флагове са включени и кои не накуп. Например:

settings &#124;= op4; // включва op4
settings &amp;= ~op3; // изключва op3
if((flags &amp; (op3 &#124; op4 )) == (op3 &#124; op4)) {...} // проверява дали op3 и op4 са включени

Така извършени операциите са много бързи.

Същото може да се използва за означение на RGB цветове:

final int red_mask =  0x000000FF
final int green_mask = 0x0000FF00
final int blue_mask = 0x00FF0000

int pixel = 0x...; // форматът на цветовете е RRGGBB и обикновено се записват в HEX от 00 до FF (0,...,255)
int red = (pixel &amp; red_mask); // извлича червеното от пиксела
int green = (pixel &amp; green_mask) &gt;&gt; 8; // зеленото
int blue = (pixel &amp; blue_mask) &gt;&gt; 16; // синьото

Eто как може да се комбинират цветовете обратно (примерно след като сигналите са изпратени до съответното устройство):
int vazstanovenPixel = (red) &#124; (green &lt;&lt; 8) &#124; (blue &lt;&lt; 16);

Също така се използват при правенето на сокети и други мрежови връзки или връзки с компютърна периферия. Там винаги има &quot;стоп битове&quot;, &quot;контролни суми&quot;, и др., които обикновено се осъществяват чрез побитови операции. При кодирането и компресията на файлове се използват много побитови операции. Зад много хардуерни устройства, като например програматори за перални, хладилници и т.н., стои &quot;елементарен софтуер&quot;, който обикновено се крепи на комбинации от побитови оператори (нещо подобно на примера с флаговете, но може и да е по-сложно).

XOR оператора се използва в по-старите графични среди или съвременните като remote desktop (нуждаещи се от малък трафик). Причината е, че като се направи два пъти XOR се връща оригиналното число, т.е. няма нужда от &quot;redraw&quot; при извършването на определени операции (пр. оцветяването при селекция с мишка).

Ето например и как може да се използват като много бърза (не добра, но в елементарни случаи върши работа) hash функция:
int a = 4328754;
int b = 1232145;
int c = 1231231;
int hash = a ^ b ^ c;

По-сложните hash функции също използват побитови операции. Причината - бързина.

Всичко писано на асемблер ще има нужда от побитови операции. Т.е. всички embedded системи например ги използват.

Base64 кодирането ги използва - то превръща бинарна информация в символи (например се използва при трансфер на e-mail). Дотолкова съм чувал - за повече - Google :)

Със сигурност четенето и записването на файлове (IO) използва побитови операции.

Чувал си за &quot;subnet&quot; при IP адресите? Е, те се възползват именно от побитовите операции. Ето пример:
http://vmrejata.info/tcpip/312-vuvedeniesubnetmasks.html

Ето две други бързи връзки от Google с примери:

http://onjava.com/pub/a/onjava/2005/02/02/bitsets.html

http://www.devarticles.com/c/a/Cplusplus/Bitwise-Operators-in-Action/</description>
		<content:encoded><![CDATA[<p>Като ме върнахте на темата &#8211; ето нещо, което ми се наложи да пиша наскоро:</p>
<p>Често се използват при дефинирането на &#8222;флагове&#8220; (т.е. комбинация от опции, които в края на краищата искаме да видим дали са включени или не) &#8211; вместо огромно количество if-else или switch оператори, ние можем лесно да се ориентираме ако използваме побитови оператори, например:</p>
<p>final int op1 = 1; // 0001<br />
final int op2 = 2; // 0010<br />
final int op3 = 4; // 0100<br />
final int op4 = 8; // 1000<br />
&#8230; // други, степени на двойката<br />
int settings = 0; // първоначално всичко изключено</p>
<p>Ако някой флаг бъде включен &#8211; просто добавяме неговата стойност към settings. Така съответния пореден бит за този флаг става 1. Обратно &#8211; при изключването изваждаме съответния флаг и бита му става 0. Така с една променлива изключително лесно виждаме кои флагове са включени и кои не накуп. Например:</p>
<p>settings |= op4; // включва op4<br />
settings &#038;= ~op3; // изключва op3<br />
if((flags &#038; (op3 | op4 )) == (op3 | op4)) {&#8230;} // проверява дали op3 и op4 са включени</p>
<p>Така извършени операциите са много бързи.</p>
<p>Същото може да се използва за означение на RGB цветове:</p>
<p>final int red_mask =  0x000000FF<br />
final int green_mask = 0x0000FF00<br />
final int blue_mask = 0x00FF0000</p>
<p>int pixel = 0x&#8230;; // форматът на цветовете е RRGGBB и обикновено се записват в HEX от 00 до FF (0,&#8230;,255)<br />
int red = (pixel &#038; red_mask); // извлича червеното от пиксела<br />
int green = (pixel &#038; green_mask) >> 8; // зеленото<br />
int blue = (pixel &#038; blue_mask) >> 16; // синьото</p>
<p>Eто как може да се комбинират цветовете обратно (примерно след като сигналите са изпратени до съответното устройство):<br />
int vazstanovenPixel = (red) | (green < < 8) | (blue << 16);</p>
<p>Също така се използват при правенето на сокети и други мрежови връзки или връзки с компютърна периферия. Там винаги има "стоп битове", "контролни суми", и др., които обикновено се осъществяват чрез побитови операции. При кодирането и компресията на файлове се използват много побитови операции. Зад много хардуерни устройства, като например програматори за перални, хладилници и т.н., стои "елементарен софтуер", който обикновено се крепи на комбинации от побитови оператори (нещо подобно на примера с флаговете, но може и да е по-сложно).</p>
<p>XOR оператора се използва в по-старите графични среди или съвременните като remote desktop (нуждаещи се от малък трафик). Причината е, че като се направи два пъти XOR се връща оригиналното число, т.е. няма нужда от "redraw" при извършването на определени операции (пр. оцветяването при селекция с мишка).</p>
<p>Ето например и как може да се използват като много бърза (не добра, но в елементарни случаи върши работа) hash функция:<br />
int a = 4328754;<br />
int b = 1232145;<br />
int c = 1231231;<br />
int hash = a ^ b ^ c;</p>
<p>По-сложните hash функции също използват побитови операции. Причината - бързина.</p>
<p>Всичко писано на асемблер ще има нужда от побитови операции. Т.е. всички embedded системи например ги използват.</p>
<p>Base64 кодирането ги използва - то превръща бинарна информация в символи (например се използва при трансфер на e-mail). Дотолкова съм чувал - за повече - Google :)</p>
<p>Със сигурност четенето и записването на файлове (IO) използва побитови операции.</p>
<p>Чувал си за "subnet" при IP адресите? Е, те се възползват именно от побитовите операции. Ето пример:<br />
<a href="http://vmrejata.info/tcpip/312-vuvedeniesubnetmasks.html">http://vmrejata.info/tcpip/312-vuvedeniesubnetmasks.html</p>
<p>Ето две други бързи връзки от Google с примери:</p>
<p><a href="http://onjava.com/pub/a/onjava/2005/02/02/bitsets.html">http://onjava.com/pub/a/onjava/2005/02/02/bitsets.html</a></p>
<p><a href="http://www.devarticles.com/c/a/Cplusplus/Bitwise-Operators-in-Action/">http://www.devarticles.com/c/a/Cplusplus/Bitwise-Operators-in-Action/</a></p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Мартин Радев</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-11554</link>
		<dc:creator>Мартин Радев</dc:creator>
		<pubDate>Wed, 22 Dec 2010 19:10:41 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-11554</guid>
		<description>Странно, но при мен при &quot;побитовото изместване&quot; не изчезват битове. Блогът е супер и има супер много полезна информация! Ще има четене!</description>
		<content:encoded><![CDATA[<p>Странно, но при мен при &#8222;побитовото изместване&#8220; не изчезват битове. Блогът е супер и има супер много полезна информация! Ще има четене!</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Мартин</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6391</link>
		<dc:creator>Мартин</dc:creator>
		<pubDate>Sat, 20 Mar 2010 06:38:16 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6391</guid>
		<description>Благодаря много за бързият отговор</description>
		<content:encoded><![CDATA[<p>Благодаря много за бързият отговор</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Филип Петров</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6390</link>
		<dc:creator>Филип Петров</dc:creator>
		<pubDate>Fri, 19 Mar 2010 19:53:28 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6390</guid>
		<description>Ето няколко варианта:

1: Чрез събиране и изваждане
a=a+b;
b=a-b;
a=a-b;

2: Чрез умножение и деление
a=a*b;
b=a/b;
a=a/b;

3: Чрез XOR (т.е. побитово)
x = x^y
y = x^y
x = x^y</description>
		<content:encoded><![CDATA[<p>Ето няколко варианта:</p>
<p>1: Чрез събиране и изваждане<br />
a=a+b;<br />
b=a-b;<br />
a=a-b;</p>
<p>2: Чрез умножение и деление<br />
a=a*b;<br />
b=a/b;<br />
a=a/b;</p>
<p>3: Чрез XOR (т.е. побитово)<br />
x = x^y<br />
y = x^y<br />
x = x^y</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Мартин</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6389</link>
		<dc:creator>Мартин</dc:creator>
		<pubDate>Fri, 19 Mar 2010 19:21:43 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6389</guid>
		<description>забравих да кажа ако може да е Java Код, но и C++ става</description>
		<content:encoded><![CDATA[<p>забравих да кажа ако може да е Java Код, но и C++ става</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Мартин</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6388</link>
		<dc:creator>Мартин</dc:creator>
		<pubDate>Fri, 19 Mar 2010 19:20:48 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6388</guid>
		<description>Точно защото се учи &quot;отгоре-отгоре&quot; сега ми трябва за една задача. Някой ако може да помага. Трябва да разменя стойностите на 2 променливи(които си задаваме) побитово без използването на 3-та променлива. плс пишете тук или на скайп: tzanev8989</description>
		<content:encoded><![CDATA[<p>Точно защото се учи &#8222;отгоре-отгоре&#8220; сега ми трябва за една задача. Някой ако може да помага. Трябва да разменя стойностите на 2 променливи(които си задаваме) побитово без използването на 3-та променлива. плс пишете тук или на скайп: tzanev8989</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: Филип Петров</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6376</link>
		<dc:creator>Филип Петров</dc:creator>
		<pubDate>Wed, 17 Mar 2010 11:28:50 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6376</guid>
		<description>Учи се, но &quot;отгоре-отгоре&quot;.</description>
		<content:encoded><![CDATA[<p>Учи се, но &#8222;отгоре-отгоре&#8220;.</p>
]]></content:encoded>
	</item>
	<item>
		<title>От: cold</title>
		<link>http://www.cphpvb.net/pik-3/149-%d0%bf%d0%be%d0%b1%d0%b8%d1%82%d0%be%d0%b2%d0%b8-%d0%be%d0%bf%d0%b5%d1%80%d0%b0%d1%86%d0%b8%d0%b8/#comment-6373</link>
		<dc:creator>cold</dc:creator>
		<pubDate>Tue, 16 Mar 2010 21:45:19 +0000</pubDate>
		<guid isPermaLink="false">http://www.cphpvb.net/?p=149#comment-6373</guid>
		<description>Много полезно като метод и служи перфектно за ускоряване на процеса на работа на програмите.
Но доколкото знам малко хора го учат като метод в университетите.</description>
		<content:encoded><![CDATA[<p>Много полезно като метод и служи перфектно за ускоряване на процеса на работа на програмите.<br />
Но доколкото знам малко хора го учат като метод в университетите.</p>
]]></content:encoded>
	</item>
</channel>
</rss>

