임시 변수를 사용하지 않고 값을 교체할 수 있는 XOR 교체 알고리즘에 대해 알아보자


환경

  • XOR
  • 논리 회로
  • 부울 대수


XOR 연산

XOR

  • XOR: XOR 연산이란 bit단위에서는 아래의 예시처럼 서로의 비트가 다르면 1 같으면 0의 결과를 나타내는 연산자입니다.
1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0
// Example in binary
10010101
XOR
10111100

==> 00101001
// Example in decimal
149
XOR
188

==> 41


XOR 교체 알고리즘

XOR 교체 알고리즘이란?

  • XOR 교체 알고리즘이란 임시 변수를 사용하지 않고 서로 다른 두 개의 변수를 XOR 비트 연산을 이용해 값을 교체하는 알고리즘이다.


XOR 교체 알고리즘 코드 및 예시

예시

의사코드

X := X XOR Y
Y := Y XOR X
X := X XOR Y

C++ 코드

#include <iostream>
#include <stdio.h>

using namespace std;

int main(){

    int x = 1;
    int y = 2;

    printf("x: %d y: %d\n", x, y);

    if (x != y){
        x = x^y;
        y = y^x;
        x = x^y;    
    }

    printf("x: %d y: %d\n", x, y);

    return 0;
}


증명

사용되는 법칙

  • 교환법칙: A ⊕ B = B ⊕ A
  • 결합법칙: (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)

증명

  • 아래의 식을 사용
1. X := X XOR Y
2. Y := Y XOR X
3. X := X XOR Y
R1, R2 are registers

0. R1 = X, R2 = Y

1. R1 <- R1 ⊕ R2 = X ⊕ Y
=> R1 = X ⊕ Y, R2 = Y

2. R2 <- R2 ⊕ R1 = Y ⊕ (X ⊕ Y) = Y ⊕ (Y ⊕ X) = (Y ⊕ Y) ⊕ X = 0 ⊕ X = X
=> R1 = X ⊕ Y, R2 = X

3. R1 <- R1 ⊕ R2 = X ⊕ Y ⊕ X = Y ⊕ X ⊕ X = Y ⊕ (X ⊕ X) = Y ⊕ 0 = Y
=> R1 = Y, R2 = X


사용 사례 및 범위

  • RAM이 매우 한정적인 임베디드 환경
  • Register pressure가 높은 곳


사용하지 않는 이유

  • 컴파일러 수준에서 최적화가 진행되기 때문에 임시 변수를 사용하는 방법이 더 빠르다.
  • 사용법을 모르는 사람에게는 모호하다.
  • 최신 컴퓨터 아키텍처는 명령어 파이프라인에 의해 명령어 수준의 병렬처리가 가능해서 임시 변수를 이용한 교체가 더 빠르다. XOR 교체 알고리즘은 반드시 순서대로 진행되어야 하기에 병렬처리가 어렵다.


참고자료

Post about XOR swap algorithm


Environment and Prerequisite

  • XOR
  • Logic Design
  • Boolean Algebra


XOR Operation

XOR

  • XOR: XOR operation is bitwise operation which result 1 if they are different bit, result 0 if they are same bit.
1^1 = 0
1^0 = 1
0^1 = 1
0^0 = 0
// Example in binary
10010101
XOR
10111100

==> 00101001
// Example in decimal
149
XOR
188

==> 41


XOR Swap Algorithm

What is XOR Swap Algorithm?

  • XOR Swap Algorithm is an algorithm that uses the XOR bitwise operation to swap values of distinct variables without using a temporary variable


XOR Swap Algorithm Code and Example

Example

Pseudocode

X := X XOR Y
Y := Y XOR X
X := X XOR Y

C++ Code

#include <iostream>
#include <stdio.h>

using namespace std;

int main(){

    int x = 1;
    int y = 2;

    printf("x: %d y: %d\n", x, y);

    if (x != y){
        x = x^y;
        y = y^x;
        x = x^y;    
    }

    printf("x: %d y: %d\n", x, y);

    return 0;
}


Proof

Used Properties

  • Commutativity: A ⊕ B = B ⊕ A
  • Associativity: (A ⊕ B) ⊕ C = A ⊕ (B ⊕ C)

Proof

  • Use below equation
1. X := X XOR Y
2. Y := Y XOR X
3. X := X XOR Y
R1, R2 are registers

0. R1 = X, R2 = Y

1. R1 <- R1 ⊕ R2 = X ⊕ Y
=> R1 = X ⊕ Y, R2 = Y

2. R2 <- R2 ⊕ R1 = Y ⊕ (X ⊕ Y) = Y ⊕ (Y ⊕ X) = (Y ⊕ Y) ⊕ X = 0 ⊕ X = X
=> R1 = X ⊕ Y, R2 = X

3. R1 <- R1 ⊕ R2 = X ⊕ Y ⊕ X = Y ⊕ X ⊕ X = Y ⊕ (X ⊕ X) = Y ⊕ 0 = Y
=> R1 = Y, R2 = X


Reasons for use in practice

  • Embedded system of which ram memory is very limited
  • In region with high register pressure


Reasons for avoidance in practice

  • Due to compiler level optimization, using temporary variable is faster than XOR swap.
  • It is opaque to anyone unfamiliar with the technique.
  • In modern architecture, using temporary variable is faster because of instruction pipelines. Instruction pipeline enables instruction level parallel processing. XOR swap inputs to each operation depend on the results of the previous operation so it cannot be done in parallel processing.


Reference

회고를 한번 해보자!

회사는 일한지 2년이 넘었으며 기술 블로그 운영이 4년 차이다!


배경

회고를 하게된 배경은 이제 기술 블로그를 운영한지 약 4년정도가 되었고 이 블로그의 시작은 어땠는지 그리고 앞으로의 방향은 어떤지 여기는 어떤 공간인지를 정리해보고자 회고를 하게 되었다.

블로그에 글을 작성하다가 가끔 “아 이렇게까지 자세히 써야하나?”, “아 이 내용을 더 추가하면 좋을거 같은데…”, “이렇게까지 모양과 디자인에 신경써야 하나?!” 그리고 “아 글이 너무 쉽나?!” 또는 “너무 좁은 분야인가?!” 이런 생각들을 최근들어서 하는거 같다. 어느덧 실시간 접속자수와 하루 접속자수 그리고 방문하게 되는 분들을 고려하게 되었다. 그러면서 어디에 초점을 맞춰야할지를 생각하게 된거 같다. 여기 블로그는 기술을 정리하는 곳? 아니면 공부한걸 정리하는 곳? 아니면 그 모두 다일까?!

의심의 흐름대로 생각나는대로 정리할 예정이라 약간? 두서가 없을수도 있다. 하하!


블로그의 현 상황

  • 3개월 전인 9월 기준 일주일간 약 2만명(COVID-19 이후 이상하게 1만명으로 많이 떨어졌다.)
  • 3개월 전인 9월 기준 실시간 접속자 약 50명(위와 마찬가지로 최근에는 실시간 접속자가 많을 때는 약 30명 정도로 줄었다.)

꽤나 많은분들이 들어오셔서 블로그에 글을 쓸때 내용의 질을 고려하지 않을수가 없게되었다. 이전에 한번 VS에서는 빌드가 안되는데 나는 리눅스에서 빌드를 해서 문제 없다고 댓글을 달았다가.. 싫어요? 비슷한걸 받은적이 있다. 이제 유입되는 사람들도 많아지다보니 욕심이 생기는데 내용의 질을 높이고 싶었고 들어오신분들이 원하는걸 찾고 나가셨으면 한다.

최근에는 방문자 유입이 많이 줄었는데 코로나의 확산과 재택근무의 증가와 비슷하게 줄었는데 이는 우연이겠지?! 우연이라고 생각한다ㅋㅋ 질이나 내용에 문제가 있어서 방문자가 줄었을거라 생각하는데 분석이 필요해 보인다…ㅠㅠ 이렇게 최근에는 블로그 작성보다 방문자들을 더 고려하는 모습을 발견하게 되었다. 내용보다 방문자를 더 고려해서 글을 쓰는 모습을 발견하게 되었는데 과연 이게 좋은걸까?! 다음에서 정리해보자


지금까지 블로그에 글을 작성하는 경우

  • 공부하다가 모르는 부분을 조사했을 때
  • 나중에 참고할 사항이라고 생각할 때
  • 알아낸 부분중에 공유하면 좋을거 같다고 생각할 때
  • 기분이 안좋거나 생산적인 일을 하고싶을 때

최근 2년정도 블로그 작성하던 내용을 보면 대체로 어떤 내용을 공부하다가 알게된 내용이나 나중에 사용할 수 있는 부분들이 주가 된거 같다. 주로 공부나 호기심에 의한 부분들이었던거 같다. 그래서 언제는 내용이 굉장히 단순하다가도 어떤 내용은 길기도 하다. 바로 위에 정리한 먼저 3개의 경우에 내용을 주로 작성하고 남들에게 보여준다 그리고 설명한다는 생각으로 작성해왔다.

마지막으로 기분이 안좋거나 뭐라도 생산적인 일을 하고 싶을때 글을 쓰는거 같기도 하다. 뭐라도 생산적인 일을 하면 그래도 뿌듯해지니까 그런거 같다. 여기는 기술 블로그니 기분이나 생산적인 일을 왜 하고 싶은지에 대한 글은 넣어두겠다!


최근에 블로그를 작성할 때 마음가짐

  • 눈에는 잘 들어오나?
  • 설명이 이해가 잘되게 정리가 되었나?
  • 다음에 볼 때 기억이 다 날 수 있을까?
  • 더 필요한 내용은 없나?

최근에는 블로그에 글을 작성할때 점점.. 보여지는거에 지나치게 신경쓰지 않았나? 라는 생각이 든다. 내가 정리하고 내가 공부할 내용을 정리해두는 공간인데 늘어나는 방문자수에 보여지는 것에 더 신경을 쓰게 된거 같다 마치 책을 쓰는것처럼? 당연히 이쁘게 설명을 잘 써놓으면 좋은데 너무 지나치게 신경쓴 나머지 내용보다는 구성과 글을 전체적인 맥락에만 초점을 맞추는거 같다. 배보다 배꼽이 크다고 해야하나? 더 많고 깊은 내용을 쓰고 싶은데 구조와 설명에 지나치게 신경을 쓰는거 같다.

아무래도 사용자가 많아짐에 따라 생긴거 같은데 외적인 부분에 시간을 너무 쓰는거 같아서 앞으로는 좀 다른 마음가짐으로 글을 쓰고싶다.


앞으로 내가 기대하는 블로그의 모습과 내용

  • 깊은 내용과 전문적인 내용
  • 일상적인 내 공부와 궁금증들을 조사 및 정리하는 내용

솔직하게 지금 작성하는 그대로 블로그를 운영해도 문제는 없다. 포트폴리오를 완성할 수 있고 방문자들은 꾸준하게 들어오고 있기 때문이다. 그래도 최근에 약간 기술 블로그를 작성하면서 실력을 더 발전하고 싶은 마음이 생겨서 위와 같은 목표들을 잡았다. 이런저런 블로그를 보다가 인공지능이나 시스템 관련 심도 있는 논문을 정리한 블로그들을 봤는데 그런걸 보고 배움과 깊음에 대한 욕심이 생겼다.

사람들이 찾아오고 필요한 정보들을 알아갈 수 있는 블로그가 된거 같아서 이제는 실력 있는 분들이 들어와서 지식의 깊이를 확장하고 나갔으면 좋겠다는 마음이 생겼다. 물론! 개인적으로 이제 더 전문분야를 깊이 있게 파고 싶은 마음도 있다. 실력은 많이 부족하지만 논문이나 이러한 부분들 아니면 Reddit과 같은 곳에서 나오는 최신 기술들에 대해서 정리해보거나 사용후기를 써볼까 한다.


구체적인 계획

  • 전문적인 내용의 글을 추가
  • 기존과 같이 글을 쓰던 방식은 유지

기존에 잘하던 습관은 유지하되 더 앞으로 개선하는 방향을 선택했다.

앞으로는 논문이나 최신 기술들을 더 깊이있게 쓰고 내 생각을 작성하려한다. 일도 더 바빠지고 기존에 하던거에서 추가하던거라 시간이 더 걸리겠지만 새로운 글을 쓰는 간격이 길어지더라도 이제는 내용과 깊이에 신경쓰는 블로그를 작성해보려 한다.

“깊이 있는 글을 쓰자”가 앞으로의 테마다! 물론 현재 잘 유지하고 있는 “공부하고 조사한 내용들을 정리하자”는 유지!


이외에 여러 고려사항들?

블로그 템플릿

블로그 템플릿이 검색, 태그, 카테고리 그리고 글들의 목록을 다 가져오는 기능중심으로 되어있기 때문에 약간? 시각적으로 이쁘지 않은거 같은 느낌이 있다. 그래도 일단 내용의 전달에 있어서는 문제가 없다고 생각하기 때문에 후순위로 미뤘다.

방문자 데이터 분석

방문자들이 줄고 있다.. 코로나 때문인지는 모르겠지만 내 블로그에 들어오는 방문자들을 토대로 데이터 분석을 진행해보고 싶다. 가장 먼저는 어떤 글들을 사람들이 많이 찾았는지의 비율을 정리해보고 싶다. 뽑아낼 가치?가 있을지는 모르겠지만 호기심이 있다.

방문자 소통

방문자들이 댓글을 편하게 사용할 수 있게 도와드리고 싶은데 아직 오픈소스로는 Disqus가 제일인거 같다.. 이걸 확 그냥 만들어버릴까? 하하.. 아마 만들면 1년은 걸릴거 같은데..

여전히 정리할게 남은 많은 내용들

연말에 마무리 차원에서 쓰느라 급하게 쓴거 같은 느낌이 있다. 태그 같은 경우 직접 커스터마이징 한거랑 그 외에 여러 커스터마이징도 꽤 들어갔는데 그러한 부분들도 정리하면 좋을거 같고 FullStory와 같은 도구들도 붙여보고 싶다. 지금 생각은 안나지만 글들을 쓰면서 여러 많은 경우들이 있었고 재밌었던 부분들이 있었는데 하나하나 정리하지 못한게 아쉽다.


마무리

꾸준함이 중요하다. 앞으로도 꾸준하게 작성하자! 비록 쓰는 간격이 길어지더라도! 최대한!

Review my works!

Two years have been passed since I started work in company and it is fourth-year in operating a tech blog!


Background

It has been about 4 years since I started this tech blog. To write and review about why I started blog and how this blog will go. And also I’d like to write about my future will.

Nowdays when I’m writing blog I think in my head “Do I need to be specific like this?”, “I think there needs more information…”, “Should I need to care about design and text layout like this?” and “Is this post too easy?” or “Too narrow field?”. It has come to take into account the number of real-time users and the number of daily users. Since then, I started thinking about where to focus. Is my blog the place of summarzing what I learned? or I studied? or all of them?

I am going to write just following of my thingkings. So it can be a bit messy. HaHa!


Current Blog Status

  • In September, three months ago, about twenty thousand users per one week(it is dropped to ten thousand after COVID-19)
  • In September, three months ago, about 50 realtime users(like above is is dropped to about 30 after COVID-19)

Since quite many people visit my blog so I can’t help but consider about quality. I got a dislike? similar button before because I commented that there was no problem on my system build but it was problem on VS build. Now that there are more people coming in, I become a bit greedy. I’d like to improve quality and hope visitors to get what they want when visiting my blog.

Recently number of visitors has been decreased after spread of COVID-19 and telecommuting.. I’m not sure it is just coincidence. Maybe it could be? Haha. I need more analysis for decreasing of visitors… Like this I have recently discovered that I consider visitors more than writing a blog. Care more about visitors then contents hmm.. Is that good?! Let’s write about that in next part.


When I Write Blog Until Now

  • When I find something that I don’t know while studying or searching
  • When I find something that I think it will be referenced in near future
  • When I find something that is good for sharing to others
  • When I get depressed or want to do something productive

Last two years, most blog posts are mainly written for what I learned in studying or for future using as reference. Mostly focuses on my curiosity and study. So sometimes the contents are very simple but some contents are long. Usually I have written post when I encoutner above first three cases while thinking about how to show and explain to others.

Lastly, I write post when I get depressed or want to do something productive. Because doing something productive can make me feel better. It is better than do nothing. This is tech blog so I’m not gonna write about my feelings!


Thinking When I Write Blog Nowdays

  • Does it catch visitors eyes?
  • Is it well organized and easy to understand?
  • Can I remember when I read it in the future?
  • Anything more needed?

Nowdays I think I too much concern about layout… This is place for writing what I learned but I’m getting more concern and care about number of visitors like writing a book. Of cource it is good to explain well and make pretty layout but I think nowdays I’m too much concern more about layout and shape than quality of the contents. It is the tail wagging the dog. I’d like to write professional quality content but now I’m focusing more on layout.

I think it is because visitors are keep growing. That is why I focus more on layout and design. From now I’d like to write blog in a different mindset.


Expected Shape Of My Future Blog

  • Deep and professional content
  • Contents of my daily studies and researches

Honestly there is no problem on my writing blog habits. Because I can fill my portfolio and visitors are keep visiting my blog. Even so, I’d like to improve myself more so I wrote above goals. After I found some of really deep and professional artificial intelligence and system blogs, it developed my desire of learning and depth.

I think my blog became the place where people can find what they want but what I want is more. That is, visitors who visit my blog improve themselves after visiting my blog. Yes improvement place! Also I’d like to deep dive into my professional field. I’m planning to write about latest technical things on Reddit or papers.


Specific Plan

  • Add professional contents
  • Keep the way of writing as usual

Keep writing as ususal and add more professional contents.

From now, I’d like to write about latest papers and technologies. It will take much more time than now… but I will try even though the writing interval gets longer.

“Write deep and professional quality content” is my future blog theme. Of course keep writing of what I learned and searched.


Other Things?

Blog template

Blog template has many features like search, tags, categories and showing all posts but because of many features it looks not pretty. However it is not a big concern so its priority is lower than other things.

Visitor data analysis

Visitors are decreasing.. I’m not sure it is because of COVID-19 I’d like to analyze my visitors data. First one is to analyze which contents are popular. I’m not sure it is worthy but just for curiosity

Visitor communication

I’d like to communitate with visitors using comment but Disqus is the only solution… I feel like to make my own comment service haha..

Many other things that left

I feel like I’ve been writing in a hurry to finish this because it is end of the year. There still many things are left… There are stories of customizing tags and other customized things. Also I’d like to add tools like FullStory service. I cannot list now but there are many funny and useful stories about my blog. It is a bit regrettable to not write about those things.


Wrap Up

Consistency is important. Let’s keep write! Even if the writing interval gets longer! At most!

명령어 치환(command substitution)의 결과가 있는지 없는지를 조건문에서 확인할 수 있는데 이에 대해 알아보자


환경

  • Linux
  • Bash shell(/bin/bash)


상황 및 방법

상황

  • 아래처럼 쉘 스크립트에서 명령어 치환(command substitution)의 결과가 있는지 없는지를 조건문에 사용해야할 상황
  • 명령어 치환(command substitution)이란 서브쉘(subshell)을 사용해서 명령어의 결과를 가져와 대체하는걸 말한다.
#!/bin/sh

result=$(ls -al | grep sample)
...


방법

  • 아래와 같은 조건문 형식을 사용하면 된다.
  • -z 옵션을 사용해서 처리를 다르게 할 수 있다.
  • (방법 1) 조건문 안에 변수만 넣고 확인해 볼 수 있으며 크기가 0이거나 없다면 거짓이다.
  • (방법 2) -z 옵션을 사용할 수 있으며 다음에 오는 변수의 크기가 0이거나 없다면 참이다.
#!/bin/sh

result=$(ls -al | grep sample)

# Return true if its length is not zero.
if [ "${result}" ]
then
    echo "result is not empty"
else
    echo "result is empty"
fi

# Checks if the given string operand size is zero; if it is zero length, then it returns true.
if [ -z "${result}" ]
then
    echo "result is empty"
else
    echo "result is not empty"
fi


예제

  • 파일에 특정 문자열이 있는지 확인하고 없으면 추가
  • 여기서 파일은 있다고 가정
$ cat test.txt
String
$ vi test.sh
#!/bin/sh

set -e

set +e
result=$(cat test.txt | grep "test string")
set -e

if [ -z "${result}" ]
then
    echo "test string" >> test.txt
fi
$ chmod +x test.sh
$ ./test.sh
$ cat test.txt
String
test string


기타

  • grep 명령어의 경우 줄이 하나라도 생기면 0, 한 줄도 안생기면 1 그리고 오류에 대해서는 2를 종료 상태로 반환한다. 그렇기 때문에 set -e 옵션을 쓸 경우 쓰기전에 제거하고 다시 설정해줘야한다.
  • 참고: https://www.gnu.org/software/grep/manual/grep.html#Exit-Status
...
set +e
result=$(ls -al | grep sample)
set -e
...


참고자료