<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Bitwise Operation on Kelly Dev</title><link>https://kelly-chui.github.io/tags/bitwise-operation/</link><description>Recent content in Bitwise Operation on Kelly Dev</description><generator>Hugo</generator><language>en-us</language><lastBuildDate>Fri, 24 Jul 2026 11:34:15 +0900</lastBuildDate><atom:link href="https://kelly-chui.github.io/tags/bitwise-operation/index.xml" rel="self" type="application/rss+xml"/><item><title>Leetcode 3514. Number of Unique XOR Triplets II</title><link>https://kelly-chui.github.io/ps/2026/ps-leetcode-3514-number-of-unique-xor-triplets-ii/</link><pubDate>Fri, 24 Jul 2026 11:34:15 +0900</pubDate><guid>https://kelly-chui.github.io/ps/2026/ps-leetcode-3514-number-of-unique-xor-triplets-ii/</guid><description>&lt;h2 id="문제"&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.com/problems/number-of-unique-xor-triplets-ii"&gt;https://leetcode.com/problems/number-of-unique-xor-triplets-ii&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="풀이"&gt;풀이&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;n&lt;/code&gt; 길이의 배열 &lt;code&gt;nums&lt;/code&gt;가 주어지고, 여기에서 3개의 인덱스 &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt;를 (&lt;code&gt;i &amp;lt;= j &amp;lt;= k&lt;/code&gt;) 뽑아서 XOR 했을 때, 얻을 수 있는 모든 결과의 수를 리턴하는 문제이다.&lt;/p&gt;
&lt;p&gt;Leetcode 3513 문제와 다른 점은, &lt;code&gt;nums&lt;/code&gt;가 순열이 아니다. 따라서, 자연스럽게 모든 경우의 수를 커버하지 못한다. 다만, 인덱스 제약조건이 저번과 같으므로 &amp;lsquo;값 3개를 무작위&amp;rsquo;로 뽑는다는 점은 같다. 여전히 &lt;code&gt;n&lt;/code&gt;이 최대 1500이기 때문에, $O(n^3)$ 으로 풀기에는 무리가 있다.&lt;/p&gt;
&lt;p&gt;우선, 값의 중복을 가리지 않고, 인덱스도 가리지 않으므로 배열의 순서가 중요하지 않다. 따라서 배열에 있는 모든 중복을 제거하는 전처리를 한다.&lt;/p&gt;</description></item><item><title>Leetcode 3513. Number of Unique XOR Triplets I</title><link>https://kelly-chui.github.io/ps/2026/ps-leetcode-3513-number-of-unique-xor-triplets-i/</link><pubDate>Thu, 23 Jul 2026 10:33:25 +0900</pubDate><guid>https://kelly-chui.github.io/ps/2026/ps-leetcode-3513-number-of-unique-xor-triplets-i/</guid><description>&lt;h2 id="문제"&gt;문제&lt;/h2&gt;
&lt;p&gt;&lt;a href="https://leetcode.com/problems/number-of-unique-xor-triplets-i"&gt;https://leetcode.com/problems/number-of-unique-xor-triplets-i&lt;/a&gt;&lt;/p&gt;
&lt;h2 id="풀이"&gt;풀이&lt;/h2&gt;
&lt;p&gt;1에서 &lt;code&gt;n&lt;/code&gt;까지의 모든 값이 들어있는 &lt;code&gt;n&lt;/code&gt; 크기 배열 &lt;code&gt;nums&lt;/code&gt; 배열이 주어지고, 그 배열에서 인덱스 3개 &lt;code&gt;i&lt;/code&gt;, &lt;code&gt;j&lt;/code&gt;, &lt;code&gt;k&lt;/code&gt; (&lt;code&gt;i &amp;lt;= j &amp;lt;= k&lt;/code&gt;)를 골라서 XOR 했을 때, 나올 수 있는 모든 값을 리턴하면 되는 문제이다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nums&lt;/code&gt; 배열의 크기가 10만이고, 브루트 포스를하면 시간 복잡도가 $O(n^3)$ 이기 때문에 시간 내에 해결할 수 없다.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;nums&lt;/code&gt;가 순열이라는 것과 XOR의 연산 특징을 알면 생각보다 간단한 공식으로 해결할 수 있다. 우선 인덱스 제약조건은 없는 것과 마찬가지인데, 등호를 포함한 대소관계이기 때문에, 인덱스를 중복해서 골라도 된다.&lt;/p&gt;</description></item><item><title>Algorithm. Bit masking</title><link>https://kelly-chui.github.io/posts/cs-algorithm-bit-masking/</link><pubDate>Thu, 12 Jun 2025 00:00:00 +0000</pubDate><guid>https://kelly-chui.github.io/posts/cs-algorithm-bit-masking/</guid><description>&lt;h2 id="기본-소개"&gt;기본 소개&lt;/h2&gt;
&lt;p&gt;비트 마스킹은 비트 연산을 활용해서 집합을 구현하는 방법이다. 각 자리수의 비트는 하나의 원소를 나타내며, 이 원소들이 모여서 집합을 구성하게 된다.&lt;/p&gt;
&lt;p&gt;예를 들어, 원소 A, B, C, D를 각각 다음과 같이 표현할 수 있다:&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;A&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b0001&lt;/span&gt; &lt;span class="c1"&gt;// 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;B&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b0010&lt;/span&gt; &lt;span class="c1"&gt;// 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;C&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b0100&lt;/span&gt; &lt;span class="c1"&gt;// 4&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;D&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="mb"&gt;0b1000&lt;/span&gt; &lt;span class="c1"&gt;// 8&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;혹은 쉬프트 연산을 활용해서 표현할 수도 있다. 이 방법이 조금 더 직관적이고 단순하다:&lt;/p&gt;
&lt;div class="code-theme-github"&gt;&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-swift" data-lang="swift"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;A&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;0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;B&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;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;C&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;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nv"&gt;D&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;3&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;
&lt;p&gt;이렇게 원소들을 정의하게 되면, 각 원소들이 각각의 자릿수를 점유하고 있기 때문에 겹칠 일이 없다. 따라서 2진수로 쉽게 집합을 표현할 수 있다.&lt;/p&gt;</description></item></channel></rss>