<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Hrishikesh Karande</title>
    <description>The latest articles on DEV Community by Hrishikesh Karande (@hrishikesh_karande).</description>
    <link>https://dev.to/hrishikesh_karande</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3461485%2Fb4a9516f-7955-4c1f-be65-3824096794c7.jpeg</url>
      <title>DEV Community: Hrishikesh Karande</title>
      <link>https://dev.to/hrishikesh_karande</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/hrishikesh_karande"/>
    <language>en</language>
    <item>
      <title>#14 Extracting a Nibble from an 8-bit Register in C</title>
      <dc:creator>Hrishikesh Karande</dc:creator>
      <pubDate>Tue, 16 Sep 2025 22:40:20 +0000</pubDate>
      <link>https://dev.to/hrishikesh_karande/14-extracting-a-nibble-from-an-8-bit-register-in-c-473m</link>
      <guid>https://dev.to/hrishikesh_karande/14-extracting-a-nibble-from-an-8-bit-register-in-c-473m</guid>
      <description>&lt;p&gt;When I first saw the problem statement on &lt;a href="https://www.ewskills.com/task/extract-the-nibble-from-an-8-bit-register/88" rel="noopener noreferrer"&gt;EWskills&lt;/a&gt; “&lt;em&gt;extract a nibble from an 8-bit register&lt;/em&gt;”, I thought this would be easy. After all, a nibble is just 4 bits, right? But along the way, I discovered I had several gaps in my understanding — not just about bit manipulation, but also about how hexadecimal numbers, masks, and C syntax really work. In this post, I’ll walk you through my confusion, how I corrected my thinking, and what I learned about firmware development in C.&lt;/p&gt;

&lt;h2&gt;
  
  
  The Problem
&lt;/h2&gt;

&lt;p&gt;We are given:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;An 8-bit register value (0–255).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;A position:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0&lt;/code&gt; means extract the lower nibble (bits 0–3).&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;1&lt;/code&gt; means extract the upper nibble (bits 4–7).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;We need to return the nibble value as a decimal number (0–15).&lt;/p&gt;

&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Input: &lt;code&gt;reg = 0xAB, pos = 0&lt;/code&gt;
Output: &lt;code&gt;11&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;Input: &lt;code&gt;reg = 0xAB, pos = 1&lt;/code&gt;
Output: &lt;code&gt;10&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;At first, this confused me. Let’s unpack why.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Initial Confusion
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Decimal vs Hexadecimal vs Binary
&lt;/h3&gt;

&lt;p&gt;Take &lt;code&gt;0xAB&lt;/code&gt;.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In binary: &lt;code&gt;1010 1011&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;In decimal: &lt;code&gt;171&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;When we split this into nibbles:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Upper nibble: &lt;code&gt;1010&lt;/code&gt; → hex &lt;code&gt;0xA&lt;/code&gt; → decimal 10&lt;/li&gt;
&lt;li&gt;Lower nibble: &lt;code&gt;1011&lt;/code&gt; → hex &lt;code&gt;0xB&lt;/code&gt; → decimal 11&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The problem statement said the output should be &lt;code&gt;11&lt;/code&gt;. At first, I thought this was binary &lt;code&gt;11&lt;/code&gt; (which is decimal 3). That was my mistake! The expected output is in decimal, even though the register values are written in hexadecimal. Once I understood that, things became much clearer.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Writing the Mask
&lt;/h3&gt;

&lt;p&gt;I also struggled with the mask. The statement said:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;For a 3-bit field → mask = 0x07&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I thought “wait, isn’t &lt;code&gt;0x07&lt;/code&gt; just decimal &lt;code&gt;7&lt;/code&gt;? Shouldn’t it be something else?”&lt;/p&gt;

&lt;p&gt;The reality is: yes, &lt;code&gt;0x07&lt;/code&gt; is decimal 7. But in binary, it is &lt;code&gt;0000 0111&lt;/code&gt;. That’s exactly what we want for a 3-bit mask — the last 3 bits set to &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;This led me to a general rule:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;N-bit mask = (1 &amp;lt;&amp;lt; N) – 1&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Examples:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;3 bits → &lt;code&gt;(1 &amp;lt;&amp;lt; 3) – 1 = 7 = 0x07&lt;/code&gt; → &lt;code&gt;0000 0111&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;4 bits → &lt;code&gt;(1 &amp;lt;&amp;lt; 4) – 1 = 15 = 0x0F&lt;/code&gt; → &lt;code&gt;0000 1111&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;8 bits → &lt;code&gt;(1 &amp;lt;&amp;lt; 8) – 1 = 255 = 0xFF&lt;/code&gt; → &lt;code&gt;1111 1111&lt;/code&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;So for nibble extraction (4 bits), our mask should be &lt;code&gt;0x0F&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. A Bug in My First C Code
&lt;/h3&gt;

&lt;p&gt;Here’s my first attempt:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="nf"&gt;extractNibble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;                  &lt;span class="c1"&gt;// Oops!&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;lower&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;   
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;higher&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;6&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x07&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;higher&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Mistakes I made:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;if (pos = 0)&lt;/code&gt; → This was an assignment, not a comparison. It always evaluates to false. It should have been &lt;code&gt;if (pos == 0)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;My mask was &lt;code&gt;0x07&lt;/code&gt; (3 bits), but a nibble is 4 bits, so it should have been &lt;code&gt;0x0F&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;My upper nibble shift was &lt;code&gt;&amp;gt;&amp;gt; 6&lt;/code&gt;, but it should have been &lt;code&gt;&amp;gt;&amp;gt; 4&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  The Corrected Code
&lt;/h2&gt;

&lt;p&gt;Here’s the fixed version:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="nf"&gt;extractNibble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Lower nibble&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x0F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;// Upper nibble&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="mh"&gt;0x0F&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%hhu %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;extractNibble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This now works for all cases:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;0xAB, pos=0&lt;/code&gt; → 11&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0xAB, pos=1&lt;/code&gt; → 10&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;0xFF, pos=0&lt;/code&gt; → 15&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Making It More "Firmware Style"
&lt;/h2&gt;

&lt;p&gt;In embedded systems, we often use macros for clarity:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#define NIBBLE_MASK  0x0F
#define NIBBLE_BITS  4
#define EXTRACT_NIBBLE(reg, pos)  (((reg) &amp;gt;&amp;gt; ((pos) * NIBBLE_BITS)) &amp;amp; NIBBLE_MASK)
&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="nf"&gt;extractNibble&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;EXTRACT_NIBBLE&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This eliminates the &lt;code&gt;if&lt;/code&gt; statement, and clearly shows the relationship between position, shift, and mask.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Key Learnings
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;Nibble extraction: A nibble is 4 bits, and we always mask with &lt;code&gt;0x0F&lt;/code&gt; after shifting.&lt;/li&gt;
&lt;li&gt;Decimal vs Hex: Register values may be written in hex, but outputs are usually in decimal. Don’t confuse them!&lt;/li&gt;
&lt;li&gt;Mask formula: &lt;code&gt;(1 &amp;lt;&amp;lt; N) – 1&lt;/code&gt; is the universal way to get an N-bit mask.&lt;/li&gt;
&lt;li&gt;C syntax trap: &lt;code&gt;=&lt;/code&gt; vs &lt;code&gt;==&lt;/code&gt; — a small slip that breaks logic.&lt;/li&gt;
&lt;li&gt;Firmware style: Macros make register manipulation more readable and consistent.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;What seemed like a simple “extract a nibble” problem actually taught me a lot about bit manipulation, number systems, and C programming pitfalls. These are the bread and butter of firmware development — almost every hardware register requires you to mask, shift, and extract fields safely.&lt;/p&gt;

&lt;p&gt;If you’re new to embedded C, I’d recommend practicing small tasks like this. They may look trivial, but they prepare you for real-world firmware, where the difference between &lt;code&gt;0x07&lt;/code&gt; and &lt;code&gt;0x0F&lt;/code&gt; can mean your UART or ADC doesn’t work at all.&lt;/p&gt;

</description>
      <category>c</category>
      <category>firmware</category>
      <category>embedded</category>
      <category>learning</category>
    </item>
    <item>
      <title>#3 Checking the K-th Bit in C</title>
      <dc:creator>Hrishikesh Karande</dc:creator>
      <pubDate>Sun, 14 Sep 2025 13:39:21 +0000</pubDate>
      <link>https://dev.to/hrishikesh_karande/3-checking-the-k-th-bit-in-c-34gd</link>
      <guid>https://dev.to/hrishikesh_karande/3-checking-the-k-th-bit-in-c-34gd</guid>
      <description>&lt;p&gt;While working on this small problem &lt;a href="https://www.ewskills.com/task/check-if-k-th-bit-is-set/90" rel="noopener noreferrer"&gt;on EWskill&lt;/a&gt; of checking whether the K-th bit of an integer is set, I learned several important lessons about C programming and firmware development. I want to walk you through my experience, step by step, as if you’re seeing it for the first time.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Problem
&lt;/h2&gt;

&lt;p&gt;The task was simple: given an integer &lt;code&gt;N&lt;/code&gt; and a bit position &lt;code&gt;K&lt;/code&gt; (0-based index), I had to determine if the K-th bit in the binary representation of &lt;code&gt;N&lt;/code&gt; is 1 (set) or 0 (not set).&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;N = 8&lt;/code&gt; → binary: &lt;code&gt;00001000&lt;/code&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;K = 3&lt;/code&gt; → the 3rd bit is &lt;code&gt;1&lt;/code&gt;, so the output should be &lt;code&gt;1&lt;/code&gt;.
At first glance, it seems trivial, but this problem taught me a lot about bit manipulation, efficient C coding, and embedded thinking.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The Code I wrote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;isKthBitSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Write your code here&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;isKthBitSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Writing the Function Step by Step
&lt;/h2&gt;

&lt;p&gt;The first version I wrote looked like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;isKthBitSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here’s what I learned while writing this:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Bitwise AND (&lt;code&gt;&amp;amp;&lt;/code&gt;): This operator allows me to check specific bits in a number.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Left Shift (&lt;code&gt;1 &amp;lt;&amp;lt; k&lt;/code&gt;): This creates a mask where only the K-th bit is &lt;code&gt;1&lt;/code&gt;. For example, &lt;code&gt;1 &amp;lt;&amp;lt; 3&lt;/code&gt; becomes &lt;code&gt;00001000&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Logical comparison mistake: I realized that comparing with &lt;code&gt;== 1&lt;/code&gt; doesn’t work for bits other than the least significant one. For example, &lt;code&gt;(8 &amp;amp; 8) == 1&lt;/code&gt; would fail, even though the 3rd bit is set.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This taught me to always think carefully about what the bitwise operations actually return.&lt;/p&gt;

&lt;h2&gt;
  
  
  Making the Function Efficient
&lt;/h2&gt;

&lt;p&gt;After understanding the logic, I rewrote the function in a more compact way:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;isKthBitSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, I learned:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;In C, any non-zero value is considered &lt;code&gt;true&lt;/code&gt;, so we don’t always need complex &lt;code&gt;if-else&lt;/code&gt; statements.&lt;/li&gt;
&lt;li&gt;Writing concise code is important in firmware because it saves memory and execution time.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Microcontroller-Style Firmware Thinking
&lt;/h2&gt;

&lt;p&gt;Finally, I learned the “microcontroller mindset.” Firmware developers often write code that is minimal, fast, and hardware-friendly. The ultimate version of my function became:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;isKthBitSet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;ul&gt;
&lt;li&gt;No comparisons, no extra branching—just raw bitwise logic.&lt;/li&gt;
&lt;li&gt;The result is either &lt;code&gt;0&lt;/code&gt; (bit not set) or some non-zero value (bit set), which works perfectly in embedded systems.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This taught me to trust how C treats non-zero values and to think in bits rather than abstract numbers—a fundamental mindset for firmware development.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Key Learnings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Bit manipulation is powerful: It lets you control hardware directly and efficiently.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C is flexible but requires precision: Tiny mistakes, like &lt;code&gt;== 1&lt;/code&gt; versus &lt;code&gt;!= 0&lt;/code&gt;, can break logic.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Write for efficiency in firmware: Avoid unnecessary branching or comparisons.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Think in bits, not just integers: Embedded systems often deal with registers and flags where each bit matters.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

</description>
      <category>c</category>
      <category>firmware</category>
      <category>embedded</category>
      <category>learning</category>
    </item>
    <item>
      <title>#2 Toggling Bits in C</title>
      <dc:creator>Hrishikesh Karande</dc:creator>
      <pubDate>Sun, 14 Sep 2025 12:56:27 +0000</pubDate>
      <link>https://dev.to/hrishikesh_karande/toggling-bits-in-c-536h</link>
      <guid>https://dev.to/hrishikesh_karande/toggling-bits-in-c-536h</guid>
      <description>&lt;p&gt;When I started learning firmware development, I quickly realized how important bit manipulation is. Whether it’s configuring registers in a microcontroller, controlling hardware pins, or managing flags, bits are everywhere. Recently, I solved a simple but eye-opening problem &lt;a href="https://www.ewskills.com/task/bit-toggle/89" rel="noopener noreferrer"&gt;on EWskill&lt;/a&gt;: toggle the 5th bit of a given integer.&lt;/p&gt;

&lt;p&gt;This problem not only helped me practice C programming but also gave me insights into how firmware engineers think when working close to the hardware. Let me walk you through what I learned.&lt;/p&gt;

&lt;h2&gt;
  
  
  Understanding the Problem
&lt;/h2&gt;

&lt;p&gt;The task was straightforward:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Take an integer &lt;code&gt;N&lt;/code&gt;as input.&lt;/li&gt;
&lt;li&gt;Toggle (flip) the 5th bit (0-based index) of &lt;code&gt;N&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Print the result.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Input: &lt;code&gt;10&lt;/code&gt; (binary: &lt;code&gt;00001010&lt;/code&gt;) → After toggling the 5th bit → &lt;code&gt;00101010&lt;/code&gt; → Output: &lt;code&gt;42&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Input: &lt;code&gt;0&lt;/code&gt; (binary: &lt;code&gt;00000000&lt;/code&gt;) → After toggling the 5th bit → &lt;code&gt;00100000&lt;/code&gt; → Output: &lt;code&gt;32&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  My Code
&lt;/h2&gt;

&lt;p&gt;Here’s the C program I wrote:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;toggleFifthBit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;   &lt;span class="c1"&gt;// XOR with 1 shifted left by 5&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Read integer input&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toggleFifthBit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Walking Through the Code
&lt;/h2&gt;

&lt;h3&gt;
  
  
  1. Including the Standard I/O Library
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This gives us access to functions like scanf (for input) and printf (for output). In embedded systems, you may not always have these functions, but for practice on a PC, they’re perfect.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Bit Manipulation with XOR
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;^=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="mi"&gt;5&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This is the heart of the program. Let’s break it down:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;(1 &amp;lt;&amp;lt; 5)&lt;/code&gt; means take the binary &lt;code&gt;1&lt;/code&gt; and shift it left by 5 positions. That gives &lt;code&gt;00100000&lt;/code&gt; in binary (which is decimal 32).&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;code&gt;^=&lt;/code&gt; is the XOR assignment operator. It flips the bit at the position where the mask has &lt;code&gt;1&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;If the 5th bit was &lt;code&gt;0&lt;/code&gt;, it becomes &lt;code&gt;1&lt;/code&gt;.&lt;br&gt;
If the 5th bit was &lt;code&gt;1&lt;/code&gt;, it becomes &lt;code&gt;0&lt;/code&gt;.&lt;/p&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This single line of code shows how powerful bitwise operations are in C.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Input and Output
&lt;/h3&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;toggleFifthBit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here, &lt;code&gt;%d&lt;/code&gt; tells &lt;code&gt;scanf&lt;/code&gt; and &lt;code&gt;printf&lt;/code&gt; that we are working with integers.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;scanf&lt;/code&gt; takes input from the user.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;&amp;amp;n&lt;/code&gt; means “store the input at the memory address of &lt;code&gt;n&lt;/code&gt;.” This was a new concept for me — in C, when we pass variables to functions like &lt;code&gt;scanf&lt;/code&gt;, we often need to give their address so the function can modify them.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;printf&lt;/code&gt; displays the final result.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Learnings
&lt;/h2&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Bitwise operations are essential in firmware – Toggling bits is a common task when dealing with hardware registers. I now understand how to flip a single bit without disturbing the others.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;The power of XOR (&lt;code&gt;^&lt;/code&gt;) – I learned that XOR is the perfect tool for toggling. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;OR (&lt;code&gt;|&lt;/code&gt;) sets a bit.&lt;/li&gt;
&lt;li&gt;AND (&lt;code&gt;&amp;amp;&lt;/code&gt;) clears a bit&lt;/li&gt;
&lt;li&gt;XOR (&lt;code&gt;^&lt;/code&gt;) flips a bit.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Knowing when to use which operator is critical for writing efficient firmware. &lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Shifting (&lt;code&gt;&amp;lt;&amp;lt;&lt;/code&gt;) is like positioning switches – Using (&lt;code&gt;1 &amp;lt;&amp;lt; position&lt;/code&gt;) creates a bitmask. This helps in targeting a specific bit in an integer.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;C syntax and operators start making sense – I had always seen operators like &lt;code&gt;^&lt;/code&gt;, &lt;code&gt;&amp;amp;&lt;/code&gt;, and &lt;code&gt;|&lt;/code&gt; but never fully understood their purpose. This exercise gave me a practical use case.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Thinking like a firmware engineer – Even though this was a simple problem, it trained me to think in terms of binary, registers, and masks, which is exactly how embedded systems work.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;This exercise taught me that even a small C program can unlock big lessons in firmware development. Now, when I see a microcontroller register with 32 bits, I know how to target and manipulate a single bit efficiently.&lt;/p&gt;

&lt;p&gt;For beginners in C and embedded systems, I’d say: learn bit manipulation early. It’s one of the most valuable skills you’ll carry forward into real hardware projects.&lt;/p&gt;

</description>
      <category>c</category>
      <category>firmware</category>
      <category>embedded</category>
      <category>learning</category>
    </item>
    <item>
      <title>#1 Setting or Clearing a Bit in C</title>
      <dc:creator>Hrishikesh Karande</dc:creator>
      <pubDate>Sun, 14 Sep 2025 12:04:55 +0000</pubDate>
      <link>https://dev.to/hrishikesh_karande/1-setting-or-clearing-a-specific-bit-in-a-register-1k9o</link>
      <guid>https://dev.to/hrishikesh_karande/1-setting-or-clearing-a-specific-bit-in-a-register-1k9o</guid>
      <description>&lt;p&gt;When I first got the problem statement &lt;a href="https://www.ewskills.com/task/set-or-clear-a-specific-bit-in-a-register/87" rel="noopener noreferrer"&gt;on EWskills&lt;/a&gt; — “set or clear a specific bit in an 8-bit register using C” — I thought it would be a straightforward coding exercise. But as I worked through it, I realized I was uncovering some important concepts that are directly related to firmware development and low-level C programming.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;
&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="nf"&gt;modifyBit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="c1"&gt;// Write your code here&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//Set the bit for the position pos&lt;/span&gt;
        &lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;|=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="nf"&gt;if&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;  &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="c1"&gt;//Clear the bit at the position pose&lt;/span&gt;
        &lt;span class="n"&gt;reg&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;=&lt;/span&gt; &lt;span class="o"&gt;~&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="nf"&gt;main&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// This is your 8-bit register&lt;/span&gt;
    &lt;span class="kt"&gt;int&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
    &lt;span class="n"&gt;scanf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%hhu %d %d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
    &lt;span class="n"&gt;printf&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"%d"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifyBit&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;pos&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;mode&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Here are the key things I learned:&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Registers Are Just Variables in Memory
&lt;/h2&gt;

&lt;p&gt;In firmware development, hardware registers (like GPIO control registers, ADC data registers, etc.) are essentially memory locations that hold specific values. To experiment, I treated an 8-bit register as a normal C variable:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="kt"&gt;unsigned&lt;/span&gt; &lt;span class="kt"&gt;char&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This taught me that C lets us model hardware registers using basic types, but how we choose the type matters a lot.&lt;/p&gt;

&lt;h2&gt;
  
  
  2. The Role of &lt;code&gt;char&lt;/code&gt; in C
&lt;/h2&gt;

&lt;p&gt;At first, I was confused — if I declare &lt;code&gt;unsigned char reg;&lt;/code&gt;, am I saying &lt;code&gt;reg&lt;/code&gt; is a “character”?&lt;/p&gt;

&lt;p&gt;The answer is: &lt;strong&gt;no, not really.&lt;/strong&gt; &lt;/p&gt;

&lt;p&gt;In C, &lt;code&gt;char&lt;/code&gt;, &lt;code&gt;signed char&lt;/code&gt;, and &lt;code&gt;unsigned char&lt;/code&gt; are all &lt;strong&gt;integer types&lt;/strong&gt;. The keyword “char” simply reflects the size: &lt;strong&gt;1 byte&lt;/strong&gt; (typically 8 bits).&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;If I print a &lt;code&gt;char&lt;/code&gt; with &lt;code&gt;%c&lt;/code&gt;, it looks like a character (based on its ASCII value).&lt;/li&gt;
&lt;li&gt;If I print it with &lt;code&gt;%d&lt;/code&gt; or &lt;code&gt;%u&lt;/code&gt;, it shows the integer value it’s holding.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This clarified why embedded programmers often use &lt;code&gt;unsigned char&lt;/code&gt; (or, even better, &lt;code&gt;uint8_t&lt;/code&gt;) to represent hardware registers: it’s exactly 8 bits and works perfectly for bitwise operations.&lt;/p&gt;

&lt;h2&gt;
  
  
  3. Using  for Portability
&lt;/h2&gt;

&lt;p&gt;One major learning was that relying on &lt;code&gt;char&lt;/code&gt; could lead to portability issues, since the C standard only guarantees that &lt;code&gt;char&lt;/code&gt; is at least 8 bits.&lt;/p&gt;

&lt;p&gt;For portable and explicit code, I should use:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight cpp"&gt;&lt;code&gt;&lt;span class="cp"&gt;#include&lt;/span&gt; &lt;span class="cpf"&gt;&amp;lt;stdint.h&amp;gt;&lt;/span&gt;&lt;span class="cp"&gt;
&lt;/span&gt;&lt;span class="kt"&gt;uint8_t&lt;/span&gt; &lt;span class="n"&gt;reg&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This way, I am 100% sure that the “register” I’m working with is exactly 8 bits, no matter the platform or compiler.&lt;/p&gt;

&lt;p&gt;I also discovered that for input/output with &lt;code&gt;uint8_t&lt;/code&gt;, I need macros like &lt;code&gt;SCNu8&lt;/code&gt; and &lt;code&gt;PRIu8&lt;/code&gt; from &lt;code&gt;&amp;lt;inttypes.h&amp;gt;&lt;/code&gt; instead of &lt;code&gt;%hhu&lt;/code&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  4. Bitwise Operations Are the Heart of Firmware
&lt;/h2&gt;

&lt;p&gt;To modify bits, I used:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;code&gt;reg |= (1 &amp;lt;&amp;lt; pos);&lt;/code&gt; → set a bit&lt;/li&gt;
&lt;li&gt;
&lt;code&gt;reg &amp;amp;= ~(1 &amp;lt;&amp;lt; pos);&lt;/code&gt; → clear a bit&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These tiny one-liners are the building blocks of firmware programming. In real hardware, they let us do things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Turn an LED on or off.&lt;/li&gt;
&lt;li&gt;Enable/disable an interrupt.&lt;/li&gt;
&lt;li&gt;Configure control bits in a peripheral register.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This exercise made me appreciate how bitwise operations are not just theory — they’re the language of hardware control.&lt;/p&gt;

&lt;h2&gt;
  
  
  5. Format Specifiers and &lt;code&gt;%hhu&lt;/code&gt;
&lt;/h2&gt;

&lt;p&gt;Another thing I learned is how format specifiers in C work. &lt;code&gt;%u&lt;/code&gt; is for unsigned int, but since my variable was an &lt;code&gt;unsigned char&lt;/code&gt;, I needed &lt;code&gt;%hhu&lt;/code&gt;. The &lt;code&gt;hh&lt;/code&gt; modifier tells C to treat the input/output as the smallest integer type.&lt;/p&gt;

&lt;p&gt;Later, with &lt;code&gt;uint8_t&lt;/code&gt;, I learned that using portable macros like &lt;code&gt;SCNu8&lt;/code&gt; and &lt;code&gt;PRIu8&lt;/code&gt; is safer and more future-proof.&lt;/p&gt;

&lt;h2&gt;
  
  
  Final Thoughts
&lt;/h2&gt;

&lt;p&gt;This small problem gave me a big set of takeaways:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;How C types map to register sizes.&lt;/li&gt;
&lt;li&gt;Why &lt;code&gt;&amp;lt;stdint.h&amp;gt;&lt;/code&gt; is a must for portable firmware code.&lt;/li&gt;
&lt;li&gt;The practical use of bitwise operations in controlling hardware.&lt;/li&gt;
&lt;li&gt;The importance of correct format specifiers when dealing with small integer types.&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In firmware development, tiny details matter a lot — a single wrong type or operator can make the difference between a working driver and hours of debugging. This exercise reinforced the discipline of writing clear, portable, and hardware-friendly C code.&lt;/p&gt;

</description>
      <category>c</category>
      <category>firmware</category>
      <category>embedded</category>
      <category>learning</category>
    </item>
  </channel>
</rss>
