{"id":220,"date":"2015-01-04T00:40:41","date_gmt":"2015-01-03T22:40:41","guid":{"rendered":"http:\/\/ozenozkaya.com\/blog\/?p=220"},"modified":"2016-06-14T15:21:14","modified_gmt":"2016-06-14T12:21:14","slug":"gomulu-sistemler-16-gomulu-c-operatorler","status":"publish","type":"post","link":"http:\/\/ozenozkaya.com\/blog\/?p=220","title":{"rendered":"G\u00f6m\u00fcl\u00fc C &#8211; 5 : Operat\u00f6rler"},"content":{"rendered":"<p>\u00d6nceki yaz\u0131larda, bir C program\u0131 hakk\u0131nda feyizli bir tak\u0131m konular \u00fczerinde konu\u015fmu\u015ftuk. Merhaba d\u00fcnya yaz\u0131l\u0131m\u0131n\u0131n anatomisinden sonra ibretlik veri tiplerini, de\u011fi\u015fkenler ile onlara atanacak sabitleri, ard\u0131ndan da al\u0131ml\u0131 kodun olmazsa olmaz\u0131 yorum sat\u0131rlar\u0131n\u0131 incelemi\u015ftik. Bu defa ise, C dilindeki bir di\u011fer \u00f6nemli ba\u015fl\u0131k olan operat\u00f6rleri inceleyece\u011fiz.<\/p>\n<p>D\u00fcnyada \u00e7e\u015fit \u00e7e\u015fit operat\u00f6r vard\u0131r ancak ne mutlu bize ki C dilindeki operat\u00f6rler \u00e7e\u015fitleri s\u0131n\u0131rl\u0131 say\u0131da. \ud83d\ude42 Neyse, &#8220;operat\u00f6rlere \u00f6zg\u00fc bir yaz\u0131&#8221; olmas\u0131, ilk bak\u0131\u015fta biraz garip guraba gelebilir ama, operat\u00f6rler \u00f6zellikle g\u00f6m\u00fcl\u00fc programlamada &#8220;\u00e7ok bilin\u00e7li \u015fekilde kullan\u0131lmak zorunda&#8221; oldu\u011fundan de\u011fer verilmesi gereken \u00f6nemli bir konu. Bizim de niyetimiz operat\u00f6rlerin hak etti\u011fi sayg\u0131nl\u0131\u011f\u0131 kazanmas\u0131na yard\u0131mc\u0131 olabilmek.<\/p>\n<p>Bazen ayn\u0131 ama\u00e7, farkl\u0131 operat\u00f6rler ile ger\u00e7eklenebilir. Hatta genelde durum b\u00f6yledir. Bu a\u015famada, hangisini se\u00e7menin daha ak\u0131ll\u0131ca olaca\u011f\u0131na karar vermenizi sa\u011flayacak birtak\u0131m ince noktalara burada de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m. Operat\u00f6rlerin do\u011fru kullan\u0131m\u0131nda dahi baz\u0131 kazan\/kaybet (trade-off) durumlar\u0131 oldu\u011fundan, yine ibretlerle dolu bir yaz\u0131n\u0131n \u015fanl\u0131 ba\u015flang\u0131c\u0131nda oldu\u011fumuzu hissediyorum. Haydi hay\u0131rl\u0131s\u0131&#8230;<\/p>\n<p><strong>Aritmetik Operat\u00f6rler<\/strong><\/p>\n<p>C dilinde aritmetik operat\u00f6rler, bizleri \u00e7ocuklu\u011fumuza, ilkokul s\u0131ralar\u0131na g\u00f6t\u00fcr\u00fcr \ud83d\ude42<\/p>\n<p>Not: Operat\u00f6rlerin uyguland\u0131\u011f\u0131 de\u011fi\u015fken veya sabitlere genel olarak operand denebilir. A=10, B=20 i\u00e7in;<\/p>\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Operat\u00f6r<\/th>\n<th>Tan\u0131m<\/th>\n<th>\u00d6rnek<\/th>\n<\/tr>\n<tr>\n<td>+<\/td>\n<td>iki operand\u0131 toplar<\/td>\n<td>A + B =\u00a030<\/td>\n<\/tr>\n<tr>\n<td>&#8211;<\/td>\n<td>Soldaki operanddan sa\u011fdaki operand\u0131 \u00e7\u0131kar\u0131r.<\/td>\n<td>A &#8211; B =\u00a0-10<\/td>\n<\/tr>\n<tr>\n<td>*<\/td>\n<td>operandlar\u0131 \u00e7arpar<\/td>\n<td>A * B =\u00a0200<\/td>\n<\/tr>\n<tr>\n<td>\/<\/td>\n<td>soldaki operand\u0131 sa\u011fdaki operanda b\u00f6ler<\/td>\n<td>B \/ A =\u00a02<\/td>\n<\/tr>\n<tr>\n<td>%<\/td>\n<td>Mod operat\u00f6r\u00fc, b\u00f6lmeden sonra kalan\u0131 verir<\/td>\n<td>B % A =\u00a00<\/td>\n<\/tr>\n<tr>\n<td>++<\/td>\n<td>Bir art\u0131rma operat\u00f6r\u00fc<\/td>\n<td>A++ =\u00a011<\/td>\n<\/tr>\n<tr>\n<td>&#8212;<\/td>\n<td>Bir azaltma operat\u00f6r\u00fc<\/td>\n<td>A&#8211; =\u00a09<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Aritmetik operat\u00f6rleri etkin \u015fekilde \u00f6\u011frenmenin en iyi yolu, bu operat\u00f6rleri kullanarak programlar yazmak ve bunlar\u0131 \u00e7al\u0131\u015ft\u0131rarak sonu\u00e7lar\u0131 g\u00f6rmektir. Benim derdim, operat\u00f6rlerin ne i\u015f yapt\u0131\u011f\u0131n\u0131 anlatmak olmamal\u0131 diye d\u00fc\u015f\u00fcn\u00fcyorum. Herhangi bir C dersinde\/kitab\u0131nda bu zaten alenen anlat\u0131l\u0131yor. A\u015fa\u011f\u0131daki \u00f6rnek yaz\u0131l\u0131m\u0131 yazmam\u0131n ard\u0131ndan as\u0131l anlat\u0131lmas\u0131 gerken ince noktalara ge\u00e7ece\u011fiz.<\/p>\n<pre class=\"lang:default decode:true \" title=\"Artimetik operat\u00f6rler\">#include &lt;stdio.h&gt;\r\n#include &lt;stdint.h&gt;\r\n\r\n#define NUM_A  (10.0)\r\n#define NUM_B  (20.0)\r\n\r\n\r\n#define TOPLA(A,B) (A+B)\r\n\r\n#define CIKAR(A,B) (A-B)\r\n\r\n#define CARP(A,B)  (A*B)\r\n\r\n#define BOL(A,B)   (A\/B)\r\n\r\n#define MOD(A,B)   (A%B)\r\n\r\nint main()\r\n{\r\n    uint32_t i;\r\n    \r\n    printf(\"Toplama: %fnCikarma : %fnCarpma: %fnBolme: %fnMod: %dn\",TOPLA(NUM_A,NUM_B),CIKAR(NUM_A,NUM_B),CARP(NUM_A,NUM_B),BOL(NUM_A,NUM_B),MOD((uint32_t)NUM_A,(uint32_t)NUM_B));\r\n    \r\n    i=30;\r\n    printf(\"++ sonra kullanilinca i:%dn\",i++);\r\n    printf(\"bir sonraki adimda i:%dn\",i);\r\n    i=30;\r\n    printf(\"++ once kullanilinca i:%dn\",++i);\r\n    printf(\"bir sonraki adimda i:%dn\",i);\r\n    \r\n    getchar(); \/\/kullanici bir giris yapana kadar bekler\r\n    \r\n    return 0;\r\n}<\/pre>\n<p>Yukar\u0131daki kod \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olur:<\/p>\n<div class=\"su-note\"  style=\"border-color:#e5b24c;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\"><div class=\"su-note-inner su-u-clearfix su-u-trim\" style=\"background-color:#ffcc66;border-color:#ffffff;color:#333333;border-radius:3px;-moz-border-radius:3px;-webkit-border-radius:3px;\">Toplama: 30.000000\u00a0Cikarma : -10.000000\u00a0Carpma: 200.000000 Bolme: 0.500000\u00a0Mod: 10<br \/>\n++ sonra kullanilinca i:30<br \/>\nbir sonraki adimda i:31<br \/>\n++ once kullanilinca i:31<br \/>\nbir sonraki adimda i:31<br \/>\n<\/div><\/div>\n<p>\u00d6nemli bir nokta olarak i++ yazd\u0131r\u0131ld\u0131\u011f\u0131nda, \u00f6nce i&#8217;nin de\u011ferinin yazd\u0131r\u0131l\u0131p ard\u0131ndan bir art\u0131r\u0131ld\u0131\u011f\u0131nda dikkat ediniz. Ayn\u0131 \u015fekilde ++i yazd\u0131r\u0131ld\u0131\u011f\u0131nda, \u00f6nce i&#8217;nin de\u011ferinin bir art\u0131r\u0131ld\u0131\u011f\u0131nda ard\u0131ndan bu de\u011ferin yazd\u0131r\u0131ld\u0131\u011f\u0131na \u00e7ok dikkat ediniz. \u0130nananlar i\u00e7in burada b\u00fcy\u00fck ibretler var. ++ oprat\u00f6r\u00fcn\u00fc bu bilin\u00e7le kullanmakta faydalar var.<\/p>\n<p>Aritmetik operat\u00f6rlerle ilgili \u00f6nemli bir di\u011fer nokta da \u00f6ncelik s\u0131ras\u0131 kavram\u0131. \u00d6ncelik s\u0131ras\u0131na tak\u0131lmamak ve kodu okunur k\u0131lmak ad\u0131na, ard\u0131\u015f\u0131l aritmetik i\u015flemlerde parantez kullanaraktan sorunu te\u011fet ge\u00e7mekte fayda var. \u00d6rne\u011fin 13+2<em>27-12\/3 ile ne demek istedi\u011fimi anlayamayabilirsiniz, demek istedi\u011fimi yanl\u0131\u015f diyor da olabilirim ama 12+(2<\/em>27)-(12\/3) ile ne demek istedi\u011fimiz \u00e7ok a\u00e7\u0131k olur. C dilinde malum her zaman parantezin i\u00e7i \u00f6ncelikli oluyor. Hem hatalar\u0131 \u00f6nlemek i\u00e7in hem de toplum i\u00e7erisinde anla\u015f\u0131labilir olmak i\u00e7in bu al\u0131\u015fkanl\u0131\u011f\u0131 edinmekte faiderler, feyizler var.<\/p>\n<p>Aritmetik operat\u00f6rlerle ilgili bir di\u011fer \u00f6nemli nokta da, yerli yersiz kullan\u0131lmamalar\u0131. Kimi zaman (hatta \u00e7o\u011fu zaman), bir i\u015fi yapman\u0131n birden fazla yolu oluyor. \u00d6rne\u011fin 8 bitlik iki say\u0131y\u0131 al\u0131p yanyana koyup 16 bitlik tek bir say\u0131 elde etmek istedi\u011fimiz yerler oluyor. Bunu yapmak a\u015fa\u011f\u0131daki \u015fekillerde m\u00fcmk\u00fcn:<\/p>\n<pre class=\"lang:default decode:true\">uint8_t lowByte;\r\nuint8_t highByte;\r\nuint16_t myWord;\r\n\r\n\/\/y\u00f6ntem 0\r\nmyWord = (highByte*256) + lowByte;\r\n\r\n\/\/y\u00f6ntem 1\r\nmyWord = (highByte&lt;&lt;8) +  lowByte;\r\n\r\n\/\/y\u00f6ntem 3\r\nmyWord = (highByte&lt;&lt;8) |  lowByte;\r\n\r\n\/\/y\u00f6ntem 4;\r\ntypedef union\r\n{\r\nuint8_t  au8Data[2];\r\nuint16_t u16Data;\r\n}tu_DataGroup16;\r\n\r\ntu_DataGroup16 u_DataGroup16;\r\nu_DataGroup16.au8Data[0] = lowByte;\r\nu_DataGroup16.au8Data[1] = highByte;\r\nmyWord = u_DataGroup16.u16Data;\r\n\r\n<\/pre>\n<p>Baz\u0131 platformlarda toplama, \u00e7arpma gibi aritmetik i\u015flemler atomik de\u011fildir, yani bu operat\u00f6rlerin i\u015fletilmesi 1 saat darbesi s\u00fcresinden (1 cycle) fazla s\u00fcrer. Halbuki her i\u015flemcide AND,OR i\u015flemleri tek cycle&#8217;da yap\u0131l\u0131r. Buna g\u00f6re e\u011fer yukar\u0131daki kodu MSP430 serisi mikrokontrol\u00f6rler\u00a0i\u00e7in yaz\u0131yorsan\u0131z, y\u00f6ntem 0 sizi can\u0131n\u0131zdan bezdirir \u00e7\u00fcnk\u00fc e\u011fer HW multiplicator olmayan bir modelde \u00e7arpma 130 cycle kadar s\u00fcrer, HW multiplicator olan bir modelde bile \u00e7arpma 8 cycle s\u00fcrer. Daha bunun toplamas\u0131 ve atamas\u0131 da var. Halbuki Y\u00f6ntem 3&#8217;te t\u00fcm olay hepi topu 3 cycle&#8217;da biter. Y\u00f6ntem 4&#8217;\u00fcn ise \u00e7ok sanatsal bir amac\u0131 var, umar\u0131m anlam\u0131\u015fs\u0131n\u0131zd\u0131r ancak anlamad\u0131ysan\u0131z dahi ileride detayl\u0131ca anlataca\u011f\u0131m zaten.<\/p>\n<p>Neyse demek ki yerli yersiz aritmetik operat\u00f6r kullanmamak laz\u0131mm\u0131\u015f. Ger\u00e7i Arm Cortex M3 mimarisinde aritmetik operat\u00f6rler de 1 cycle s\u00fcr\u00fcyor (non-fp\u00a0i\u00e7in). Orada elinizi korkak al\u0131\u015ft\u0131rmayabilirsiniz ama yine de g\u00fcn gelir o kodu 8 bitlik bir mikrokontrol\u00f6re ta\u015f\u0131man\u0131z\u00a0gerekirse ba\u015f\u0131n\u0131z a\u011fr\u0131r. En g\u00fczeli, en ba\u015ftan \u00e7i\u00e7ek gibi bilin\u00e7le yazmak \ud83d\ude42<\/p>\n<p><strong>\u0130li\u015fkisel Operat\u00f6rler\/ Kar\u015f\u0131la\u015ft\u0131rma Operat\u00f6rleri<\/strong><\/p>\n<p>\u0130li\u015fkisel operat\u00f6rler sa\u011f ve solundaki operandlar belirli bir mant\u0131ksal ili\u015fkiye g\u00f6re kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r ve e\u011fer ili\u015fki do\u011fru ise do\u011fru d\u00f6nd\u00fcr\u00fcl\u00fcr, yanl\u0131\u015fsa yanl\u0131\u015f. \ud83d\ude00<\/p>\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Operat\u00f6r<\/th>\n<th>Tan\u0131m<\/th>\n<th>\u00d6rnek<\/th>\n<\/tr>\n<tr>\n<td>==<\/td>\n<td>\u0130ki operand birbirine e\u015fitse, sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A == B)<\/td>\n<\/tr>\n<tr>\n<td>!=<\/td>\n<td>\u0130ki operand birbirine e\u015fit de\u011filse, sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A != B)<\/td>\n<\/tr>\n<tr>\n<td>&gt;<\/td>\n<td>Soldaki operand sa\u011fdakinden b\u00fcy\u00fck ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A &gt; B)<\/td>\n<\/tr>\n<tr>\n<td>&lt;<\/td>\n<td>Soldaki operand sa\u011fdakinden k\u00fc\u00e7\u00fck\u00a0ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A &lt; B)<\/td>\n<\/tr>\n<tr>\n<td>&gt;=<\/td>\n<td>Soldaki operand sa\u011fdakinden b\u00fcy\u00fck ya da e\u015fit ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A &gt;= B)<\/td>\n<\/tr>\n<tr>\n<td>&lt;=<\/td>\n<td>Soldaki operand sa\u011fdakinden k\u00fc\u00e7\u00fck\u00a0ya da e\u015fit ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\n<td>(A &lt;= B)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Bu k\u0131s\u0131mla ilgili verilecek ibretlik mesaj\u0131 \u00f6nceki k\u0131s\u0131mlarda vermi\u015ftik. Ancak tekrar bir hat\u0131rlatma yapmak gerekirse;kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri genellikle if,while gibi ko\u015ful\/d\u00f6ng\u00fc i\u015flemlerinde kullan\u0131l\u0131r ve do\u011fal olarak en \u00e7ok hata da buralarda yap\u0131l\u0131r. \u00d6rne\u011fin s\u0131k yap\u0131lan hatalardan biri if(age == 18) \u00a0yazacakken yanl\u0131\u015fl\u0131kla if(age=18) yazmakt\u0131r. Bu durumda age de\u011fi\u015fkenini 18 ile kar\u015f\u0131la\u015ft\u0131rmak yerine, age de\u011fi\u015fkenine 18 atam\u0131\u015f ve d\u00f6n\u00fc\u015f olarak true alm\u0131\u015f olursunuz. If i\u00e7inde atama yapmak m\u00fcmk\u00fcn oldu\u011fundan derleyici buna hata vermez, uyar\u0131 verebilir. Bu hatay\u0131 hi\u00e7 yapmaman\u0131n yolu if(18 == age) format\u0131n\u0131 kullanmakt\u0131r. Yani sabiti sola, de\u011fi\u015fkeni sa\u011fa almakt\u0131r. Bu durumda yanl\u0131\u015fl\u0131kla if(18 = age) yazsan\u0131z bile, derleyici size sabite de\u011fi\u015fken atanmaz diye hata verir. Bu arada 18 yazd\u0131m ama, \u00f6rnek anla\u015f\u0131ls\u0131n diyerekten say\u0131y\u0131 do\u011frudan yazd\u0131m \ud83d\ude42 Yoksa MAGIC_NUMBER kullanmak yok \ud83d\ude09 \u00d6nerdi\u011fim formatta yazacak olursam e\u011fer if(ageOfDriverCandidate\u00a0== AGE_LIMIT_TO_DRIVE) yerine\u00a0if(AGE_LIMIT_TO_DRIVE == ageOfDriverCandidate) yazmakta fayda var. Ya da bu hususta s\u0131k hata yap\u0131yorsan\u0131z, bir makro yaratarak, ve onu bir kez test ederek bu sorunu tarihin tozlu sayfalar\u0131na g\u00f6mebilirsiniz :<\/p>\n<pre class=\"lang:c decode:true \">#define IS_EQUAL(ARG1,ARG2)  (ARG1==ARG2)\r\n#define ESIT_MI(OP1,OP2)     (OP1 == OP2)\r\n\r\n\/\/English\r\n#define AGE_LIMIT_TO_DRIVE (18U)\r\nuint8_t ageOfDriverCandidate;\r\n..\r\nif(IS_EQUAL(AGE_LIMIT_TO_DRIVE ,ageOfDriverCandidate))\r\n{\r\n\/\/rockie detected\r\n}\r\n..\r\n\/\/Turkce\r\n#define EHLIYET_YAS_SINIRI    (18U)\r\nuint8_t surucuAdayininYasi;\r\n..\r\nif(ESIT_MI(EHLIYET_YAS_SINIRI    ,surucuAdayininYasi))\r\n{\r\n\/\/ahanda caylak geldi\r\n}<\/pre>\n<p>&nbsp;<\/p>\n<p><strong>Mant\u0131ksal\u00a0Operat\u00f6rler<\/strong><\/p>\n<p>Bazen birden fazla ko\u015ful ayn\u0131 anda de\u011ferlendirilmek istenebilir. Bu durumda mant\u0131ksal ili\u015fkiye g\u00f6re (ve,veya,de\u011fil) ko\u015fullar de\u011ferlendirilebilir.<\/p>\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Operat\u00f6r<\/th>\n<th>Tan\u0131m<\/th>\n<th>\u00d6rnek<\/th>\n<\/tr>\n<tr>\n<td>&amp;&amp;<\/td>\n<td>Mant\u0131ksal VE(AND) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r. E\u011fer iki taraf da s\u0131f\u0131rdan farkl\u0131 ise, sonu\u00e7 do\u011fru(true) olur.<\/td>\n<td>(A &amp;&amp; B)<\/td>\n<\/tr>\n<tr>\n<td>||<\/td>\n<td>Mant\u0131ksal VEYA(OR) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r. E\u011fer iki taraftan herhangi biri s\u0131f\u0131rdan farkl\u0131 ise, sonu\u00e7 do\u011fru(true) olur.<\/td>\n<td>(A || B)<\/td>\n<\/tr>\n<tr>\n<td>!<\/td>\n<td>Mant\u0131ksal DE\u011e\u0130L(NOT) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r.\u00a0Operand\u0131n mant\u0131ksal tersi al\u0131n\u0131r; operand 1 ise sonu\u00e7 0, operand 0 ise sonu\u00e7 1 olur.<\/td>\n<td>!(A &amp;&amp; B)<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>Mant\u0131ksal operat\u00f6rler birle\u015ftirilerek kullan\u0131labilir. Ancak insan akl\u0131n\u0131n almayaca\u011f\u0131 uzunlukta bir ko\u015ful s\u00f6z konusu ise, o ko\u015ful ya <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=113\" target=\"_blank\">indirgenmeli<\/a>, ya da <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=198\" target=\"_blank\">yorum sat\u0131rlar\u0131 ile<\/a> a\u00e7\u0131klanmal\u0131d\u0131r. \u0130nsan akl\u0131 derinlik olarak ortalama 7 seviye ili\u015fkiye kadar haf\u0131zada tutabilir. Fazlas\u0131 olmaz \ud83d\ude42 if i\u00e7inde 9 tane ko\u015ful yazmamakta fayda var.<\/p>\n<pre class=\"lang:default decode:true\" title=\"K\u00f6t\u00fc \u00d6rnek\">if((isUserAuthenticated &amp;&amp; (userAge&gt;=AGE_LIMIT_TO_DRIVE)) || isUserBilal)\r\n{\r\n\/\/do not touch\r\n}<\/pre>\n<p><strong>Bitsel\/\u0130kili (Bitwise\/Binary)\u00a0Operat\u00f6rler<\/strong><\/p>\n<p>Esasen bitsel operat\u00f6rlerin ci\u011ferini <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=111\">BURADA<\/a>, \u00e7i\u00e7ek gibi a\u00e7\u0131klad\u0131k. Hatta elektronik olarak nas\u0131l ger\u00e7eklendi\u011fini de konu\u015ftuk. Ancak tabi ki olay\u0131 bir de yaz\u0131l\u0131m perspektifinde incelemekte say\u0131s\u0131z feyizler var. Zira g\u00f6m\u00fcl\u00fc sistemlerde kimi\u00a0zaman bir bitin bile hesab\u0131 yap\u0131l\u0131r. Hesab\u0131n\u0131n yap\u0131lmad\u0131\u011f\u0131 yerde bile, kullan\u0131lan mikrokontrol\u00f6r\u00fcn bir register\u0131ndaki bir biti 1 ya da 0&#8217;a \u00e7ekmek i\u00e7in bitsel operat\u00f6rler kullan\u0131labilir. Bu s\u00f6yledi\u011fim ilk a\u015famada bir anlam ifade etmemi\u015f olabilir, ancak ileride de\u011finece\u011fimiz \u00fczere mikrokontol\u00f6rdeki donan\u0131m\u0131 kullanabilmek i\u00e7in, geni\u015fli\u011fi genelde i\u015flemcinin adres yolu geni\u015fli\u011fi kadar olan (8\/16\/32 bit), ay\u0131r\u0131lm\u0131\u015f \u00f6zel bellek alanlar\u0131na (register) bir tak\u0131m veriler yazmak gerekir. Belle\u011fi verimli kullanmak i\u00e7in bir register i\u00e7indeki her bitin ayr\u0131 ayr\u0131 i\u015flevi olur. Bu nedenle registerlara bitsel olarak eri\u015fmek gerekir. Burada da genellikle bitsel operat\u00f6rler kullan\u0131l\u0131r. Yani mevzu, o kadar \u00f6nemli ki, ate\u015f ediyor =)<\/p>\n<p>Misal\u00a0A = 60; ve\u00a0B = 13; olsun. Bunlar\u0131n ikili tabanda g\u00f6sterimi \u015f\u00f6yle olur:<\/p>\n<p>A = 0011 1100<\/p>\n<p>B = 0000 1101<\/p>\n<p>Buna g\u00f6re<\/p>\n<p>A&amp;B = 0000 1100<\/p>\n<p>A|B = 0011 1101<\/p>\n<p>A^B = 0011 0001<\/p>\n<p>~A\u00a0 = 1100 0011<\/p>\n<table class=\"src\">\n<tbody>\n<tr>\n<th>Operat\u00f6r<\/th>\n<th>Tan\u0131m<\/th>\n<th>\u00d6rnek<\/th>\n<\/tr>\n<tr>\n<td>&amp;<\/td>\n<td>Bitsel VE Operat\u00f6r\u00fc<\/td>\n<td>(A &amp; B) =\u00a012, yani\u00a00000 1100<\/td>\n<\/tr>\n<tr>\n<td>|<\/td>\n<td>Bitsel VEYA Operat\u00f6r\u00fc<\/td>\n<td>(A | B) =\u00a061,\u00a0yani\u00a0 0011 1101<\/td>\n<\/tr>\n<tr>\n<td>^<\/td>\n<td>Bitsel XOR\u00a0Operat\u00f6r\u00fc<\/td>\n<td>(A ^ B) =\u00a049, yani\u00a0\u00a00011 0001<\/td>\n<\/tr>\n<tr>\n<td>~<\/td>\n<td>T\u00fcmleyen operat\u00f6r\u00fc. Operand\u0131n 1 olan bitlerini 0, 0 olan bitlerini de 1 yapar.<\/td>\n<td>(~A ) =\u00a0-61, yani\u00a0\u00a01100 0011<\/td>\n<\/tr>\n<tr>\n<td>&lt;&lt;<\/td>\n<td>Sola kayd\u0131rma operat\u00f6r\u00fc. Soldaki operand\u0131n bitleri, sa\u011f operand kadar sola kayd\u0131r\u0131l\u0131r ve her kayd\u0131rmada en sola 0 eklenir. (Kar\u0131\u015f\u0131k oldu, \u00f6rnek \u00fczerinden g\u00f6rmekte fayda var)<\/td>\n<td>A &lt;&lt; 2 =\u00a0240 yani\u00a01111 0000<\/td>\n<\/tr>\n<tr>\n<td>&gt;&gt;<\/td>\n<td>Sa\u011fa\u00a0kayd\u0131rma operat\u00f6r\u00fc. Soldaki operand\u0131n bitleri, sa\u011f operand kadar sa\u011fa\u00a0kayd\u0131r\u0131l\u0131r ve her kayd\u0131rmada en sa\u011fa\u00a00 eklenir.(Kar\u0131\u015f\u0131k oldu, \u00f6rnek \u00fczerinden g\u00f6rmekte fayda var)<\/td>\n<td>A &gt;&gt; 2 =\u00a015 yani\u00a00000 1111<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<p>\u015eimdi gelelim fas\u00fclyenin faydalar\u0131na \ud83d\ude42 Yani her yerde yazmayan \u00f6nemli bilgilere&#8230;<\/p>\n<p>&amp; (VE) operat\u00f6r\u00fc ile maskeleme yap\u0131larak bir say\u0131n\u0131n 1 olan bitlerini 0&#8217;a \u00e7ekmek yani temizlemek m\u00fcmk\u00fcnd\u00fcr. Misal:<\/p>\n<pre class=\"lang:c++ decode:true\" title=\"Bit temizleme :D\">\/*Asagidakilerin hepsi PORTB'nin 3. bitini 0'a \u00e7eker.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik s\u0131f\u0131ra \u00e7eker, yani o pinde 0V g\u00f6r\u00fcl\u00fcr. *\/\r\n\r\nPORTB = PORTB &amp; 0b11110111;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB &amp; 0xF7;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB &amp;=  ~(1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define CLEAR_BIT(DATA,BIT_INDEX) do(DATA&amp;= ~(1&lt;&lt;BIT_INDEX);)while(0)\r\nCLEAR_BIT(PORTB ,3);<\/pre>\n<p>&nbsp;<\/p>\n<p>| (VEYA)\u00a0operat\u00f6r\u00fc ile maskeleme yap\u0131larak bir say\u0131n\u0131n 0\u00a0olan bitlerini 1&#8217;e \u00e7ekmek yani set etmek! (kurmak)\u00a0m\u00fcmk\u00fcnd\u00fcr. Misal:<\/p>\n<pre class=\"lang:c++ decode:true \">\/*Asagidakilerin hepsi PORTB'nin 3. bitini 1'e \u00e7eker.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik bire \u00e7eker, yani o pinde 5V g\u00f6r\u00fcl\u00fcr. *\/\r\n\r\nPORTB = PORTB | 0b00001000;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB | 0x08;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB |=  (1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define SET_BIT(DATA,BIT_INDEX) do(DATA|= (1&lt;&lt;BIT_INDEX);)while(0)\r\nSET_BIT(PORTB ,3);<\/pre>\n<p>^ (XOR) operat\u00f6r\u00fc cand\u0131r! Bu operat\u00f6r ile maskeleme yaparak bir say\u0131n\u0131n herhangi bir bitini (ya da bitlerini) terslemek m\u00fcmk\u00fcnd\u00fcr.<\/p>\n<pre class=\"lang:c++ decode:true \">\/*Asagidakilerin hepsi PORTB'nin 3. bitini tersler.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pin lojik birde ise bu pini lojik s\u0131f\u0131ra \u00e7eker, yani o pinde 5V varken art\u0131k 0V g\u00f6r\u00fcl\u00fcr. Benzer \u015fekild epin lojik s\u0131f\u0131rda ise bu pini lojik bire \u00e7eker, yani o pinde 0V varken art\u0131k 5V g\u00f6r\u00fcl\u00fcr  *\/\r\n\r\nPORTB = PORTB ^ 0b00001000;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB ^ 0x08;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB ^=  (1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define TOGGLE_BIT(DATA,BIT_INDEX) do(DATA^= (1&lt;&lt;BIT_INDEX);)while(0)\r\nTOGGLE_BIT(PORTB ,3);\r\n<\/pre>\n<p>Ek olarak kayd\u0131rma operat\u00f6r\u00fcn\u00fcn, cyclic olup olmad\u0131\u011f\u0131 her platformda mutlaka test edilmelidir. Normalde cyclic olmaz, ama test etmekte fayda var =)<\/p>\n<p>Yazd\u0131\u011f\u0131m \u00f6rneklerde zaten kayd\u0131rma operat\u00f6r\u00fcn\u00fcn kullan\u0131m\u0131 da var. Bir de ^=, +=, |= gibi \u00f6rneklerden atama operat\u00f6r\u00fcn\u00fcn di\u011fer bitsel ve aritmetik operat\u00f6rlerle birle\u015ftirilebildi\u011fini de g\u00f6stermi\u015f olduk diye d\u00fc\u015f\u00fcn\u00fcyorum.<\/p>\n<p>Bu g\u00fcn bu yaz\u0131m\u0131 Mustafa Keser \u00fcstad\u0131m\u0131z\u0131n s\u00f6z\u00fc ile sonland\u0131r\u0131yorum.<\/p>\n<blockquote><p>&#8220;Eveeeeet, bir pro\u011fram\u0131n daha sonuna geldiiik.\u00a0Tekrar g\u00f6r\u00fc\u015fmek \u00fczere efeem.&#8221;<\/p><\/blockquote>\n<p>&nbsp;<\/p>\n<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=198\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-left\" style=\"font-size:13px;color:#FFFFFF\"><\/i> \u00d6nceki Sayfa<\/span><\/a> \u00a0<a href=\"http:\/\/ozenozkaya.com\/blog\/?p=245\" class=\"su-button su-button-style-3d\" style=\"color:#FFFFFF;background-color:#2D89EF;border-color:#246ec0;border-radius:5px\" target=\"_self\"><span style=\"color:#FFFFFF;padding:6px 16px;font-size:13px;line-height:20px;border-color:#6cadf4;border-radius:5px;text-shadow:none\"><i class=\"sui sui-arrow-circle-right\" style=\"font-size:13px;color:#FFFFFF\"><\/i> Sonraki Sayfa<\/span><\/a>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00d6nceki yaz\u0131larda, bir C program\u0131 hakk\u0131nda feyizli bir tak\u0131m konular \u00fczerinde konu\u015fmu\u015ftuk. Merhaba d\u00fcnya yaz\u0131l\u0131m\u0131n\u0131n anatomisinden sonra ibretlik veri tiplerini, de\u011fi\u015fkenler ile onlara atanacak sabitleri, ard\u0131ndan da al\u0131ml\u0131 kodun olmazsa olmaz\u0131 yorum sat\u0131rlar\u0131n\u0131 incelemi\u015ftik. Bu defa ise, C dilindeki bir di\u011fer \u00f6nemli ba\u015fl\u0131k olan operat\u00f6rleri inceleyece\u011fiz. D\u00fcnyada \u00e7e\u015fit \u00e7e\u015fit operat\u00f6r vard\u0131r ancak ne mutlu bize <a class=\"read-more\" href=\"http:\/\/ozenozkaya.com\/blog\/?p=220\">Read more<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_tr_post_content":"\u00d6nceki yaz\u0131larda, bir C program\u0131 hakk\u0131nda feyizli bir tak\u0131m konular \u00fczerinde konu\u015fmu\u015ftuk. Merhaba d\u00fcnya yaz\u0131l\u0131m\u0131n\u0131n anatomisinden sonra ibretlik veri tiplerini, de\u011fi\u015fkenler ile onlara atanacak sabitleri, ard\u0131ndan da al\u0131ml\u0131 kodun olmazsa olmaz\u0131 yorum sat\u0131rlar\u0131n\u0131 incelemi\u015ftik. Bu defa ise, C dilindeki bir di\u011fer \u00f6nemli ba\u015fl\u0131k olan operat\u00f6rleri inceleyece\u011fiz.\r\n\r\nD\u00fcnyada \u00e7e\u015fit \u00e7e\u015fit operat\u00f6r vard\u0131r ancak ne mutlu bize ki C dilindeki operat\u00f6rler \u00e7e\u015fitleri s\u0131n\u0131rl\u0131 say\u0131da. :) Neyse, \"operat\u00f6rlere \u00f6zg\u00fc bir yaz\u0131\" olmas\u0131, ilk bak\u0131\u015fta biraz garip guraba gelebilir ama, operat\u00f6rler \u00f6zellikle g\u00f6m\u00fcl\u00fc programlamada \"\u00e7ok bilin\u00e7li \u015fekilde kullan\u0131lmak zorunda\" oldu\u011fundan de\u011fer verilmesi gereken \u00f6nemli bir konu. Bizim de niyetimiz operat\u00f6rlerin hak etti\u011fi sayg\u0131nl\u0131\u011f\u0131 kazanmas\u0131na yard\u0131mc\u0131 olabilmek.\r\n\r\nBazen ayn\u0131 ama\u00e7, farkl\u0131 operat\u00f6rler ile ger\u00e7eklenebilir. Hatta genelde durum b\u00f6yledir. Bu a\u015famada, hangisini se\u00e7menin daha ak\u0131ll\u0131ca olaca\u011f\u0131na karar vermenizi sa\u011flayacak birtak\u0131m ince noktalara burada de\u011finmeye \u00e7al\u0131\u015faca\u011f\u0131m. Operat\u00f6rlerin do\u011fru kullan\u0131m\u0131nda dahi baz\u0131 kazan\/kaybet (trade-off) durumlar\u0131 oldu\u011fundan, yine ibretlerle dolu bir yaz\u0131n\u0131n \u015fanl\u0131 ba\u015flang\u0131c\u0131nda oldu\u011fumuzu hissediyorum. Haydi hay\u0131rl\u0131s\u0131...\r\n\r\n<strong>Aritmetik Operat\u00f6rler<\/strong>\r\n\r\nC dilinde aritmetik operat\u00f6rler, bizleri \u00e7ocuklu\u011fumuza, ilkokul s\u0131ralar\u0131na g\u00f6t\u00fcr\u00fcr :)\r\n\r\nNot: Operat\u00f6rlerin uyguland\u0131\u011f\u0131 de\u011fi\u015fken veya sabitlere genel olarak operand denebilir. A=10, B=20 i\u00e7in;\r\n<table class=\"src\">\r\n<tbody>\r\n<tr>\r\n<th>Operat\u00f6r<\/th>\r\n<th>Tan\u0131m<\/th>\r\n<th>\u00d6rnek<\/th>\r\n<\/tr>\r\n<tr>\r\n<td>+<\/td>\r\n<td>iki operand\u0131 toplar<\/td>\r\n<td>A + B =\u00a030<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>-<\/td>\r\n<td>Soldaki operanddan sa\u011fdaki operand\u0131 \u00e7\u0131kar\u0131r.<\/td>\r\n<td>A - B =\u00a0-10<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>*<\/td>\r\n<td>operandlar\u0131 \u00e7arpar<\/td>\r\n<td>A * B =\u00a0200<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>\/<\/td>\r\n<td>soldaki operand\u0131 sa\u011fdaki operanda b\u00f6ler<\/td>\r\n<td>B \/ A =\u00a02<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>%<\/td>\r\n<td>Mod operat\u00f6r\u00fc, b\u00f6lmeden sonra kalan\u0131 verir<\/td>\r\n<td>B % A =\u00a00<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>++<\/td>\r\n<td>Bir art\u0131rma operat\u00f6r\u00fc<\/td>\r\n<td>A++ =\u00a011<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>--<\/td>\r\n<td>Bir azaltma operat\u00f6r\u00fc<\/td>\r\n<td>A-- =\u00a09<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\nAritmetik operat\u00f6rleri etkin \u015fekilde \u00f6\u011frenmenin en iyi yolu, bu operat\u00f6rleri kullanarak programlar yazmak ve bunlar\u0131 \u00e7al\u0131\u015ft\u0131rarak sonu\u00e7lar\u0131 g\u00f6rmektir. Benim derdim, operat\u00f6rlerin ne i\u015f yapt\u0131\u011f\u0131n\u0131 anlatmak olmamal\u0131 diye d\u00fc\u015f\u00fcn\u00fcyorum. Herhangi bir C dersinde\/kitab\u0131nda bu zaten alenen anlat\u0131l\u0131yor. A\u015fa\u011f\u0131daki \u00f6rnek yaz\u0131l\u0131m\u0131 yazmam\u0131n ard\u0131ndan as\u0131l anlat\u0131lmas\u0131 gerken ince noktalara ge\u00e7ece\u011fiz.\r\n<pre class=\"lang:default decode:true \" title=\"Artimetik operat\u00f6rler\">#include &lt;stdio.h&gt;\r\n#include &lt;stdint.h&gt;\r\n\r\n#define NUM_A  (10.0)\r\n#define NUM_B  (20.0)\r\n\r\n\r\n#define TOPLA(A,B) (A+B)\r\n\r\n#define CIKAR(A,B) (A-B)\r\n\r\n#define CARP(A,B)  (A*B)\r\n\r\n#define BOL(A,B)   (A\/B)\r\n\r\n#define MOD(A,B)   (A%B)\r\n\r\nint main()\r\n{\r\n    uint32_t i;\r\n    \r\n    printf(\"Toplama: %fnCikarma : %fnCarpma: %fnBolme: %fnMod: %dn\",TOPLA(NUM_A,NUM_B),CIKAR(NUM_A,NUM_B),CARP(NUM_A,NUM_B),BOL(NUM_A,NUM_B),MOD((uint32_t)NUM_A,(uint32_t)NUM_B));\r\n    \r\n    i=30;\r\n    printf(\"++ sonra kullanilinca i:%dn\",i++);\r\n    printf(\"bir sonraki adimda i:%dn\",i);\r\n    i=30;\r\n    printf(\"++ once kullanilinca i:%dn\",++i);\r\n    printf(\"bir sonraki adimda i:%dn\",i);\r\n    \r\n    getchar(); \/\/kullanici bir giris yapana kadar bekler\r\n    \r\n    return 0;\r\n}<\/pre>\r\nYukar\u0131daki kod \u00e7al\u0131\u015ft\u0131r\u0131ld\u0131\u011f\u0131nda, \u00e7\u0131kt\u0131s\u0131 a\u015fa\u011f\u0131daki gibi olur:\r\n\r\n[su_note note_color=\"#ffcc66\"]Toplama: 30.000000\u00a0Cikarma : -10.000000\u00a0Carpma: 200.000000 Bolme: 0.500000\u00a0Mod: 10\r\n++ sonra kullanilinca i:30\r\nbir sonraki adimda i:31\r\n++ once kullanilinca i:31\r\nbir sonraki adimda i:31\r\n[\/su_note]\r\n\r\n\u00d6nemli bir nokta olarak i++ yazd\u0131r\u0131ld\u0131\u011f\u0131nda, \u00f6nce i'nin de\u011ferinin yazd\u0131r\u0131l\u0131p ard\u0131ndan bir art\u0131r\u0131ld\u0131\u011f\u0131nda dikkat ediniz. Ayn\u0131 \u015fekilde ++i yazd\u0131r\u0131ld\u0131\u011f\u0131nda, \u00f6nce i'nin de\u011ferinin bir art\u0131r\u0131ld\u0131\u011f\u0131nda ard\u0131ndan bu de\u011ferin yazd\u0131r\u0131ld\u0131\u011f\u0131na \u00e7ok dikkat ediniz. \u0130nananlar i\u00e7in burada b\u00fcy\u00fck ibretler var. ++ oprat\u00f6r\u00fcn\u00fc bu bilin\u00e7le kullanmakta faydalar var.\r\n\r\nAritmetik operat\u00f6rlerle ilgili \u00f6nemli bir di\u011fer nokta da \u00f6ncelik s\u0131ras\u0131 kavram\u0131. \u00d6ncelik s\u0131ras\u0131na tak\u0131lmamak ve kodu okunur k\u0131lmak ad\u0131na, ard\u0131\u015f\u0131l aritmetik i\u015flemlerde parantez kullanaraktan sorunu te\u011fet ge\u00e7mekte fayda var. \u00d6rne\u011fin 13+2<em>27-12\/3 ile ne demek istedi\u011fimi anlayamayabilirsiniz, demek istedi\u011fimi yanl\u0131\u015f diyor da olabilirim ama 12+(2<\/em>27)-(12\/3) ile ne demek istedi\u011fimiz \u00e7ok a\u00e7\u0131k olur. C dilinde malum her zaman parantezin i\u00e7i \u00f6ncelikli oluyor. Hem hatalar\u0131 \u00f6nlemek i\u00e7in hem de toplum i\u00e7erisinde anla\u015f\u0131labilir olmak i\u00e7in bu al\u0131\u015fkanl\u0131\u011f\u0131 edinmekte faiderler, feyizler var.\r\n\r\nAritmetik operat\u00f6rlerle ilgili bir di\u011fer \u00f6nemli nokta da, yerli yersiz kullan\u0131lmamalar\u0131. Kimi zaman (hatta \u00e7o\u011fu zaman), bir i\u015fi yapman\u0131n birden fazla yolu oluyor. \u00d6rne\u011fin 8 bitlik iki say\u0131y\u0131 al\u0131p yanyana koyup 16 bitlik tek bir say\u0131 elde etmek istedi\u011fimiz yerler oluyor. Bunu yapmak a\u015fa\u011f\u0131daki \u015fekillerde m\u00fcmk\u00fcn:\r\n<pre class=\"lang:default decode:true\">uint8_t lowByte;\r\nuint8_t highByte;\r\nuint16_t myWord;\r\n\r\n\/\/y\u00f6ntem 0\r\nmyWord = (highByte*256) + lowByte;\r\n\r\n\/\/y\u00f6ntem 1\r\nmyWord = (highByte&lt;&lt;8) +  lowByte;\r\n\r\n\/\/y\u00f6ntem 3\r\nmyWord = (highByte&lt;&lt;8) |  lowByte;\r\n\r\n\/\/y\u00f6ntem 4;\r\ntypedef union\r\n{\r\nuint8_t  au8Data[2];\r\nuint16_t u16Data;\r\n}tu_DataGroup16;\r\n\r\ntu_DataGroup16 u_DataGroup16;\r\nu_DataGroup16.au8Data[0] = lowByte;\r\nu_DataGroup16.au8Data[1] = highByte;\r\nmyWord = u_DataGroup16.u16Data;\r\n\r\n<\/pre>\r\nBaz\u0131 platformlarda toplama, \u00e7arpma gibi aritmetik i\u015flemler atomik de\u011fildir, yani bu operat\u00f6rlerin i\u015fletilmesi 1 saat darbesi s\u00fcresinden (1 cycle) fazla s\u00fcrer. Halbuki her i\u015flemcide AND,OR i\u015flemleri tek cycle'da yap\u0131l\u0131r. Buna g\u00f6re e\u011fer yukar\u0131daki kodu MSP430 serisi mikrokontrol\u00f6rler\u00a0i\u00e7in yaz\u0131yorsan\u0131z, y\u00f6ntem 0 sizi can\u0131n\u0131zdan bezdirir \u00e7\u00fcnk\u00fc e\u011fer HW multiplicator olmayan bir modelde \u00e7arpma 130 cycle kadar s\u00fcrer, HW multiplicator olan bir modelde bile \u00e7arpma 8 cycle s\u00fcrer. Daha bunun toplamas\u0131 ve atamas\u0131 da var. Halbuki Y\u00f6ntem 3'te t\u00fcm olay hepi topu 3 cycle'da biter. Y\u00f6ntem 4'\u00fcn ise \u00e7ok sanatsal bir amac\u0131 var, umar\u0131m anlam\u0131\u015fs\u0131n\u0131zd\u0131r ancak anlamad\u0131ysan\u0131z dahi ileride detayl\u0131ca anlataca\u011f\u0131m zaten.\r\n\r\nNeyse demek ki yerli yersiz aritmetik operat\u00f6r kullanmamak laz\u0131mm\u0131\u015f. Ger\u00e7i Arm Cortex M3 mimarisinde aritmetik operat\u00f6rler de 1 cycle s\u00fcr\u00fcyor (non-fp\u00a0i\u00e7in). Orada elinizi korkak al\u0131\u015ft\u0131rmayabilirsiniz ama yine de g\u00fcn gelir o kodu 8 bitlik bir mikrokontrol\u00f6re ta\u015f\u0131man\u0131z\u00a0gerekirse ba\u015f\u0131n\u0131z a\u011fr\u0131r. En g\u00fczeli, en ba\u015ftan \u00e7i\u00e7ek gibi bilin\u00e7le yazmak :)\r\n\r\n<strong>\u0130li\u015fkisel Operat\u00f6rler\/ Kar\u015f\u0131la\u015ft\u0131rma Operat\u00f6rleri<\/strong>\r\n\r\n\u0130li\u015fkisel operat\u00f6rler sa\u011f ve solundaki operandlar belirli bir mant\u0131ksal ili\u015fkiye g\u00f6re kar\u015f\u0131la\u015ft\u0131r\u0131l\u0131r ve e\u011fer ili\u015fki do\u011fru ise do\u011fru d\u00f6nd\u00fcr\u00fcl\u00fcr, yanl\u0131\u015fsa yanl\u0131\u015f. :D\r\n<table class=\"src\">\r\n<tbody>\r\n<tr>\r\n<th>Operat\u00f6r<\/th>\r\n<th>Tan\u0131m<\/th>\r\n<th>\u00d6rnek<\/th>\r\n<\/tr>\r\n<tr>\r\n<td>==<\/td>\r\n<td>\u0130ki operand birbirine e\u015fitse, sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A == B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>!=<\/td>\r\n<td>\u0130ki operand birbirine e\u015fit de\u011filse, sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A != B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&gt;<\/td>\r\n<td>Soldaki operand sa\u011fdakinden b\u00fcy\u00fck ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A &gt; B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&lt;<\/td>\r\n<td>Soldaki operand sa\u011fdakinden k\u00fc\u00e7\u00fck\u00a0ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A &lt; B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&gt;=<\/td>\r\n<td>Soldaki operand sa\u011fdakinden b\u00fcy\u00fck ya da e\u015fit ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A &gt;= B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&lt;=<\/td>\r\n<td>Soldaki operand sa\u011fdakinden k\u00fc\u00e7\u00fck\u00a0ya da e\u015fit ise,\u00a0sonu\u00e7 do\u011fru(true,1) olur<\/td>\r\n<td>(A &lt;= B)<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\nBu k\u0131s\u0131mla ilgili verilecek ibretlik mesaj\u0131 \u00f6nceki k\u0131s\u0131mlarda vermi\u015ftik. Ancak tekrar bir hat\u0131rlatma yapmak gerekirse;kar\u015f\u0131la\u015ft\u0131rma operat\u00f6rleri genellikle if,while gibi ko\u015ful\/d\u00f6ng\u00fc i\u015flemlerinde kullan\u0131l\u0131r ve do\u011fal olarak en \u00e7ok hata da buralarda yap\u0131l\u0131r. \u00d6rne\u011fin s\u0131k yap\u0131lan hatalardan biri if(age == 18) \u00a0yazacakken yanl\u0131\u015fl\u0131kla if(age=18) yazmakt\u0131r. Bu durumda age de\u011fi\u015fkenini 18 ile kar\u015f\u0131la\u015ft\u0131rmak yerine, age de\u011fi\u015fkenine 18 atam\u0131\u015f ve d\u00f6n\u00fc\u015f olarak true alm\u0131\u015f olursunuz. If i\u00e7inde atama yapmak m\u00fcmk\u00fcn oldu\u011fundan derleyici buna hata vermez, uyar\u0131 verebilir. Bu hatay\u0131 hi\u00e7 yapmaman\u0131n yolu if(18 == age) format\u0131n\u0131 kullanmakt\u0131r. Yani sabiti sola, de\u011fi\u015fkeni sa\u011fa almakt\u0131r. Bu durumda yanl\u0131\u015fl\u0131kla if(18 = age) yazsan\u0131z bile, derleyici size sabite de\u011fi\u015fken atanmaz diye hata verir. Bu arada 18 yazd\u0131m ama, \u00f6rnek anla\u015f\u0131ls\u0131n diyerekten say\u0131y\u0131 do\u011frudan yazd\u0131m :) Yoksa MAGIC_NUMBER kullanmak yok ;) \u00d6nerdi\u011fim formatta yazacak olursam e\u011fer if(ageOfDriverCandidate\u00a0== AGE_LIMIT_TO_DRIVE) yerine\u00a0if(AGE_LIMIT_TO_DRIVE == ageOfDriverCandidate) yazmakta fayda var. Ya da bu hususta s\u0131k hata yap\u0131yorsan\u0131z, bir makro yaratarak, ve onu bir kez test ederek bu sorunu tarihin tozlu sayfalar\u0131na g\u00f6mebilirsiniz :\r\n<pre class=\"lang:c decode:true \">#define IS_EQUAL(ARG1,ARG2)  (ARG1==ARG2)\r\n#define ESIT_MI(OP1,OP2)     (OP1 == OP2)\r\n\r\n\/\/English\r\n#define AGE_LIMIT_TO_DRIVE (18U)\r\nuint8_t ageOfDriverCandidate;\r\n..\r\nif(IS_EQUAL(AGE_LIMIT_TO_DRIVE ,ageOfDriverCandidate))\r\n{\r\n\/\/rockie detected\r\n}\r\n..\r\n\/\/Turkce\r\n#define EHLIYET_YAS_SINIRI    (18U)\r\nuint8_t surucuAdayininYasi;\r\n..\r\nif(ESIT_MI(EHLIYET_YAS_SINIRI    ,surucuAdayininYasi))\r\n{\r\n\/\/ahanda caylak geldi\r\n}<\/pre>\r\n&nbsp;\r\n\r\n<strong>Mant\u0131ksal\u00a0Operat\u00f6rler<\/strong>\r\n\r\nBazen birden fazla ko\u015ful ayn\u0131 anda de\u011ferlendirilmek istenebilir. Bu durumda mant\u0131ksal ili\u015fkiye g\u00f6re (ve,veya,de\u011fil) ko\u015fullar de\u011ferlendirilebilir.\r\n<table class=\"src\">\r\n<tbody>\r\n<tr>\r\n<th>Operat\u00f6r<\/th>\r\n<th>Tan\u0131m<\/th>\r\n<th>\u00d6rnek<\/th>\r\n<\/tr>\r\n<tr>\r\n<td>&amp;&amp;<\/td>\r\n<td>Mant\u0131ksal VE(AND) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r. E\u011fer iki taraf da s\u0131f\u0131rdan farkl\u0131 ise, sonu\u00e7 do\u011fru(true) olur.<\/td>\r\n<td>(A &amp;&amp; B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>||<\/td>\r\n<td>Mant\u0131ksal VEYA(OR) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r. E\u011fer iki taraftan herhangi biri s\u0131f\u0131rdan farkl\u0131 ise, sonu\u00e7 do\u011fru(true) olur.<\/td>\r\n<td>(A || B)<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>!<\/td>\r\n<td>Mant\u0131ksal DE\u011e\u0130L(NOT) operat\u00f6r\u00fc \u00e7a\u011f\u0131r\u0131l\u0131r.\u00a0Operand\u0131n mant\u0131ksal tersi al\u0131n\u0131r; operand 1 ise sonu\u00e7 0, operand 0 ise sonu\u00e7 1 olur.<\/td>\r\n<td>!(A &amp;&amp; B)<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\nMant\u0131ksal operat\u00f6rler birle\u015ftirilerek kullan\u0131labilir. Ancak insan akl\u0131n\u0131n almayaca\u011f\u0131 uzunlukta bir ko\u015ful s\u00f6z konusu ise, o ko\u015ful ya <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=113\" target=\"_blank\">indirgenmeli<\/a>, ya da <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=198\" target=\"_blank\">yorum sat\u0131rlar\u0131 ile<\/a> a\u00e7\u0131klanmal\u0131d\u0131r. \u0130nsan akl\u0131 derinlik olarak ortalama 7 seviye ili\u015fkiye kadar haf\u0131zada tutabilir. Fazlas\u0131 olmaz :) if i\u00e7inde 9 tane ko\u015ful yazmamakta fayda var.\r\n<pre class=\"lang:default decode:true\" title=\"K\u00f6t\u00fc \u00d6rnek\">if((isUserAuthenticated &amp;&amp; (userAge&gt;=AGE_LIMIT_TO_DRIVE)) || isUserBilal)\r\n{\r\n\/\/do not touch\r\n}<\/pre>\r\n<strong>Bitsel\/\u0130kili (Bitwise\/Binary)\u00a0Operat\u00f6rler<\/strong>\r\n\r\nEsasen bitsel operat\u00f6rlerin ci\u011ferini <a href=\"http:\/\/ozenozkaya.com\/blog\/?p=111\">BURADA<\/a>, \u00e7i\u00e7ek gibi a\u00e7\u0131klad\u0131k. Hatta elektronik olarak nas\u0131l ger\u00e7eklendi\u011fini de konu\u015ftuk. Ancak tabi ki olay\u0131 bir de yaz\u0131l\u0131m perspektifinde incelemekte say\u0131s\u0131z feyizler var. Zira g\u00f6m\u00fcl\u00fc sistemlerde kimi\u00a0zaman bir bitin bile hesab\u0131 yap\u0131l\u0131r. Hesab\u0131n\u0131n yap\u0131lmad\u0131\u011f\u0131 yerde bile, kullan\u0131lan mikrokontrol\u00f6r\u00fcn bir register\u0131ndaki bir biti 1 ya da 0'a \u00e7ekmek i\u00e7in bitsel operat\u00f6rler kullan\u0131labilir. Bu s\u00f6yledi\u011fim ilk a\u015famada bir anlam ifade etmemi\u015f olabilir, ancak ileride de\u011finece\u011fimiz \u00fczere mikrokontol\u00f6rdeki donan\u0131m\u0131 kullanabilmek i\u00e7in, geni\u015fli\u011fi genelde i\u015flemcinin adres yolu geni\u015fli\u011fi kadar olan (8\/16\/32 bit), ay\u0131r\u0131lm\u0131\u015f \u00f6zel bellek alanlar\u0131na (register) bir tak\u0131m veriler yazmak gerekir. Belle\u011fi verimli kullanmak i\u00e7in bir register i\u00e7indeki her bitin ayr\u0131 ayr\u0131 i\u015flevi olur. Bu nedenle registerlara bitsel olarak eri\u015fmek gerekir. Burada da genellikle bitsel operat\u00f6rler kullan\u0131l\u0131r. Yani mevzu, o kadar \u00f6nemli ki, ate\u015f ediyor =)\r\n\r\nMisal\u00a0A = 60; ve\u00a0B = 13; olsun. Bunlar\u0131n ikili tabanda g\u00f6sterimi \u015f\u00f6yle olur:\r\n\r\nA = 0011 1100\r\n\r\nB = 0000 1101\r\n\r\nBuna g\u00f6re\r\n\r\nA&amp;B = 0000 1100\r\n\r\nA|B = 0011 1101\r\n\r\nA^B = 0011 0001\r\n\r\n~A\u00a0 = 1100 0011\r\n<table class=\"src\">\r\n<tbody>\r\n<tr>\r\n<th>Operat\u00f6r<\/th>\r\n<th>Tan\u0131m<\/th>\r\n<th>\u00d6rnek<\/th>\r\n<\/tr>\r\n<tr>\r\n<td>&amp;<\/td>\r\n<td>Bitsel VE Operat\u00f6r\u00fc<\/td>\r\n<td>(A &amp; B) =\u00a012, yani\u00a00000 1100<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>|<\/td>\r\n<td>Bitsel VEYA Operat\u00f6r\u00fc<\/td>\r\n<td>(A | B) =\u00a061,\u00a0yani\u00a0 0011 1101<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>^<\/td>\r\n<td>Bitsel XOR\u00a0Operat\u00f6r\u00fc<\/td>\r\n<td>(A ^ B) =\u00a049, yani\u00a0\u00a00011 0001<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>~<\/td>\r\n<td>T\u00fcmleyen operat\u00f6r\u00fc. Operand\u0131n 1 olan bitlerini 0, 0 olan bitlerini de 1 yapar.<\/td>\r\n<td>(~A ) =\u00a0-61, yani\u00a0\u00a01100 0011<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&lt;&lt;<\/td>\r\n<td>Sola kayd\u0131rma operat\u00f6r\u00fc. Soldaki operand\u0131n bitleri, sa\u011f operand kadar sola kayd\u0131r\u0131l\u0131r ve her kayd\u0131rmada en sola 0 eklenir. (Kar\u0131\u015f\u0131k oldu, \u00f6rnek \u00fczerinden g\u00f6rmekte fayda var)<\/td>\r\n<td>A &lt;&lt; 2 =\u00a0240 yani\u00a01111 0000<\/td>\r\n<\/tr>\r\n<tr>\r\n<td>&gt;&gt;<\/td>\r\n<td>Sa\u011fa\u00a0kayd\u0131rma operat\u00f6r\u00fc. Soldaki operand\u0131n bitleri, sa\u011f operand kadar sa\u011fa\u00a0kayd\u0131r\u0131l\u0131r ve her kayd\u0131rmada en sa\u011fa\u00a00 eklenir.(Kar\u0131\u015f\u0131k oldu, \u00f6rnek \u00fczerinden g\u00f6rmekte fayda var)<\/td>\r\n<td>A &gt;&gt; 2 =\u00a015 yani\u00a00000 1111<\/td>\r\n<\/tr>\r\n<\/tbody>\r\n<\/table>\r\n\u015eimdi gelelim fas\u00fclyenin faydalar\u0131na :) Yani her yerde yazmayan \u00f6nemli bilgilere...\r\n\r\n&amp; (VE) operat\u00f6r\u00fc ile maskeleme yap\u0131larak bir say\u0131n\u0131n 1 olan bitlerini 0'a \u00e7ekmek yani temizlemek m\u00fcmk\u00fcnd\u00fcr. Misal:\r\n<pre class=\"lang:c++ decode:true\" title=\"Bit temizleme :D\">\/*Asagidakilerin hepsi PORTB'nin 3. bitini 0'a \u00e7eker.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik s\u0131f\u0131ra \u00e7eker, yani o pinde 0V g\u00f6r\u00fcl\u00fcr. *\/\r\n\r\nPORTB = PORTB &amp; 0b11110111;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB &amp; 0xF7;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB &amp;=  ~(1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define CLEAR_BIT(DATA,BIT_INDEX) do(DATA&amp;= ~(1&lt;&lt;BIT_INDEX);)while(0)\r\nCLEAR_BIT(PORTB ,3);<\/pre>\r\n&nbsp;\r\n\r\n| (VEYA)\u00a0operat\u00f6r\u00fc ile maskeleme yap\u0131larak bir say\u0131n\u0131n 0\u00a0olan bitlerini 1'e \u00e7ekmek yani set etmek! (kurmak)\u00a0m\u00fcmk\u00fcnd\u00fcr. Misal:\r\n<pre class=\"lang:c++ decode:true \">\/*Asagidakilerin hepsi PORTB'nin 3. bitini 1'e \u00e7eker.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pinini lojik bire \u00e7eker, yani o pinde 5V g\u00f6r\u00fcl\u00fcr. *\/\r\n\r\nPORTB = PORTB | 0b00001000;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB | 0x08;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB |=  (1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define SET_BIT(DATA,BIT_INDEX) do(DATA|= (1&lt;&lt;BIT_INDEX);)while(0)\r\nSET_BIT(PORTB ,3);<\/pre>\r\n^ (XOR) operat\u00f6r\u00fc cand\u0131r! Bu operat\u00f6r ile maskeleme yaparak bir say\u0131n\u0131n herhangi bir bitini (ya da bitlerini) terslemek m\u00fcmk\u00fcnd\u00fcr.\r\n<pre class=\"lang:c++ decode:true \">\/*Asagidakilerin hepsi PORTB'nin 3. bitini tersler.Bu i\u015flem ger\u00e7ekte PIC mikrodenetleyicilerde B portunun 3 pin lojik birde ise bu pini lojik s\u0131f\u0131ra \u00e7eker, yani o pinde 5V varken art\u0131k 0V g\u00f6r\u00fcl\u00fcr. Benzer \u015fekild epin lojik s\u0131f\u0131rda ise bu pini lojik bire \u00e7eker, yani o pinde 0V varken art\u0131k 5V g\u00f6r\u00fcl\u00fcr  *\/\r\n\r\nPORTB = PORTB ^ 0b00001000;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB = PORTB ^ 0x08;\r\n\r\n\/\/ya da ayni sey:\r\nPORTB ^=  (1&lt;&lt;3);\r\n\r\n\/\/ya da macro yazalim yine ayni sey\r\n#define TOGGLE_BIT(DATA,BIT_INDEX) do(DATA^= (1&lt;&lt;BIT_INDEX);)while(0)\r\nTOGGLE_BIT(PORTB ,3);\r\n<\/pre>\r\nEk olarak kayd\u0131rma operat\u00f6r\u00fcn\u00fcn, cyclic olup olmad\u0131\u011f\u0131 her platformda mutlaka test edilmelidir. Normalde cyclic olmaz, ama test etmekte fayda var =)\r\n\r\nYazd\u0131\u011f\u0131m \u00f6rneklerde zaten kayd\u0131rma operat\u00f6r\u00fcn\u00fcn kullan\u0131m\u0131 da var. Bir de ^=, +=, |= gibi \u00f6rneklerden atama operat\u00f6r\u00fcn\u00fcn di\u011fer bitsel ve aritmetik operat\u00f6rlerle birle\u015ftirilebildi\u011fini de g\u00f6stermi\u015f olduk diye d\u00fc\u015f\u00fcn\u00fcyorum.\r\n\r\nBu g\u00fcn bu yaz\u0131m\u0131 Mustafa Keser \u00fcstad\u0131m\u0131z\u0131n s\u00f6z\u00fc ile sonland\u0131r\u0131yorum.\r\n<blockquote>\"Eveeeeet, bir pro\u011fram\u0131n daha sonuna geldiiik.\u00a0Tekrar g\u00f6r\u00fc\u015fmek \u00fczere efeem.\"<\/blockquote>\r\n&nbsp;\r\n\r\n[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=198\" style=\"3d\"\u00a0icon=\"icon: arrow-circle-left\"]\u00d6nceki Sayfa[\/su_button] \u00a0[su_button url=\"http:\/\/ozenozkaya.com\/blog\/?p=245\" style=\"3d\" icon=\"icon: arrow-circle-right\"]Sonraki Sayfa[\/su_button]\r\n\r\n&nbsp;","_tr_post_name":"gomulu-sistemler-16-gomulu-c-operatorler","_tr_post_excerpt":"","_tr_post_title":"G\u00f6m\u00fcl\u00fc C - 5 : Operat\u00f6rler","_en_post_content":"","_en_post_name":"","_en_post_excerpt":"","_en_post_title":"","edit_language":"tr","jetpack_post_was_ever_published":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"enabled":false},"version":2}},"categories":[3],"tags":[6],"class_list":["post-220","post","type-post","status-publish","format-standard","hentry","category-gomulu-sistemler","tag-gomulu-sistemler"],"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p5gWM6-3y","jetpack-related-posts":[],"_links":{"self":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/220","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=220"}],"version-history":[{"count":4,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/220\/revisions"}],"predecessor-version":[{"id":562,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=\/wp\/v2\/posts\/220\/revisions\/562"}],"wp:attachment":[{"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=220"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=220"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/ozenozkaya.com\/blog\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=220"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}