Node.js를 사용할 일이 있어서 빠르게 찾아봤다.



Reference: https://github.com/nodesource/distributions/blob/master/README.md#debinstall




1. PPA 등록


    - curl도 싫어하고 ppa 등록하는 것도 싫어하지만...


> curl -sL https://deb.nodesource.com/setup_12.x | sudo -E bash -




2. nodejs 설치


    - 이제 그냥 설치하면 된다.


❯ sudo apt install -y nodejs




3. Test


    - 잘 되는지 직접 해보자.


> nano ./server.js


var http = require('http');

var os = require('os');


var host = os.hostname();

var handleRequest = function(request, response) {

    console.log('Received request for URL: ' + request.url);

    response.writeHead(200);

    response.end('Server is running on: ' + host);

};


var www = http.createServer(handleRequest);

www.listen(8080);


> nodejs ./server.js


    - 웹브라우저로 살펴보자.




잘 된다!!!



반응형


우리 공주님이 앉아서 열심히 피아노 연주를 하는

피아노 의자


구매한지 얼마 안된거 같은데

어느덧

세월의 흔적으로

모서리 마모가 되었다



그래서, 새제품으로 구매를 하려다가...

인터넷에서 우연히 발견한 의자 리폼 !!!


장비병에 빠진 나는... 바로 구매 시작 !!!


지름신이시여~~~ !!!




의자 가죽 리폼 작업에 필요한 장비는 다음과 같다.


타카

타카핀 제거기

인조가죽

드라이버

가위 / 칼(커터)

뺀찌 (플라이어)




이번에 새로 구매한 것들을 하나씩 알아보면...



[ 타카 ]


전동(가스) 타카를 갖고 싶지만

너무 과한 투자라 생각했기에 ... "핸드 타카" 선택



다이소에 3-5천원 제품도 있지만

오랫동안 두고 두고 사용할 것이기에 이왕이면 좋은 제품으로 ...


"디월트 DWHTTR510 5 IN 1 멀티타카"


여러가지 심을 사용할 수 있어야 하니까..... !!! ^^




[ 타카 핀 제거기 ]


의자에 기존에 박혀있던 타카 심을 제거해야 하니 리무버도 하나 구매를...



커터를 이용해도 되고, 다른 대체품도 있을 수 있지만


적은 노력으로 높은 효율을 얻기 위해서는 전문 제품으로...


"아펙슨 AR-425"




[ 인조 가죽 ]


저렴한 아이들도 많지만,


친환경

두께 0.8mm 이상


위 2가지를 기준으로 해서 구매했다.


색상, 표면 무늬 등을 고려해서 여유있는 길이로 구매하면 된다.





그 외 나머지는 기존에 갖고 있는 것들로~



이제 작업 시작~!!!




의자를 뒤집어서 나사를 풀면 된다.


우리 공주님 찬조 출연 !!



수월한 작업을 위해 전동 드라이버 투입!!



조금은 여유있게 가죽 자르기 !!



타카는 손 힘도 조금 필요하고

소음도 있다보니

직접 작업을 해야해서 사진이 없어서 아쉽다.


가죽을 힘껏 당겨서 타카를 팍! 팍!


그리고 남는 가죽은 깔끔하게 싹둑!



모서리 부분을 예쁘게 잡아주기가 쉽지 않았다.



그리고 다시 다리에 의자 고정



피아노의자 인조가죽 리폼

완성~!!!


우리의 첫 작품이었다.






첫 작품이 의외의 퀄리티로 나오자

우리 왕비마마가 식탁 의자도

한 번 해보라고 하셔서

도전 ~ !!!



식탁 의자 中 하나만 저렇게 갈라졌다.



열심히 의자 분리



으음?! 뭔가가 덮고 있네 !!!



타카심 제거기 투입~!!



기존에 있던 인조가죽을 제거하고 작업해야하는데,

왕비마마가 그냥 그 위에 덮어버리라고 하셔서...


(기존 가죽을 제거하면 안에서 뭔가 가루가 더 나올것만 같은 불길함을 느끼셨다고...)



가죽 쫙쫙 잘 땡기면서

타카질 열심히 하고

의자에 다시 고정을 하면 끝~!!!



왕비마마가 간만에 칭찬해 줬다.



앞으로 가죽 교체할 일 있으면 열심히 해봐야겠다.

적은 노력으로 의외의 퀄리티 !!!



반응형


인터넷 속도를 측정하기 위한

많은 사이트, 서비스들이 있지만...

내 마음에 드는 깔끔한 것들은 잘 보이지 않았다.


그러다가 찾은 깔끔한 인터넷 속도 측정 사이트 !!!


그것도 Netflix에서 제공을 해준다고 하니 믿을만하기도 하고...


광고도 없고...


한글도 지원을 해주는...



    - https://fast.com/ko/



사이트에 접속하면 정말 깔끔한 내용만 나온다!!!



   - 속도가 마음에 들지는 않지만, 그건 내가 가입한 인터넷업체 문제인 것이고... ^^





아! 그런데, 위 사이트는 일반적인 인터넷 속도 측정은 아니다 !!!

즉, Netflix 와의 통신 속도이다!!!


일반적인 인터넷 속도 측정은 아래 사이트를 이용하기 바란다.


    - http://speed.nia.or.kr



작지만, 클라이언트를 설치해야하고 살짝 귀찮은 부분이 없지 않지만 그래도 나름 정확한 측정을 해준다고 한다.



우왓~ 속도 잘 나오네!? ^^


반응형


SW 개발자라고 하면 누구나 알고 있는 Stackoverflow


신기하게도 영어를 싫어하는 개발자들조차도

애용한다는 Stackoverflow


그러한 Stackoverflow에서 2019년 Survey를 발표하였다.




Developer Survey Results

2019



https://insights.stackoverflow.com/survey/2019




무려 9만여명의 개발자들의 응답 내용으로 만들어진 Survey라고 한다.




[ 주요 결과 ]



Python


   - 가장 사랑받고, 또 가장 원하는 언어로 뽑힌 Python 이다.

   - 가장 사랑받는 순위로는 2위이지만, 가장 원하는 언어로는 1위에 뽑혔다.



   - 가장 최악의 언어 순위가... Object-C, C, PHP, Ruby, R, C++, Java 등이 있는 것이 눈에 띈다.

   - 사랑하는 언어 1위로 뽑힌 Rust가 원하는 언어로는 6위에 있는 것 또한 특이하다.




DevOps / SRE


   - 업무에 가장 만족하며, 취업 안정성 측면에서도 가장 좋은 평가를 받고 있는 일자리는 바로 DevOps/SRE 분야인 것으로 나타났습니다.

   - 최근 서비스 SW 개발분야가 각광을 받는 배경때문이지 않을까 싶습니다.



   - 임금에 있어서도 manager에 이어 나란히 2/3위가 DevOps와 SRE이다.




Benefit of Stackoverflow


   - 60%의 개발자들은 평균 3회 정도 문제를 해결하기 위해 Stackoverflow를 방문한다고 한다.



   - 또한 이렇게 Stackoverflow를 통해 문제를 해결하는 것은 개발자에게 주당 30 ~ 90 분의 시간을 절약 해준다고 한다.





재미있는 다양한 설문 조사 결과를 볼 수 있어서 좋다.

전세계에 있는 9만여명의 개발자들에 대해서 볼 수 있는 기회가 흔하지 않기 때문이다.


더 많은 결과를 보고 싶으신 분들은 사이트에 방문하면~!! ^^


반응형


얼마전 할아버지 맥북-프로 중고를 구매했다.


내가 원하는 개발환경 구축에는 실패했지만,

이 할아버지를 현역으로 연명시켜주고 싶었다.


그러던 중 최근에 macOS 카탈리나 버전이 나왔다는 소식을 접하게 되었는데,

당연하게도 우리 할아버지 mid 2010 맥북프로는 지원을 하지 않았다.


그러던 중...

이러한 할아버지들을 위한 Patcher가 있다는 이야기를 듣게 되었다.


빙고!!!


필자의 맥북은... Mid 2010 맥북프로 이다.


0. USB 메모리 준비

    - Catalina 설치용 USB를 만들어야 하기에 메모리가 필요하다!!!


1. Patcher 다운로드

    - 우리 할아버지에서 아래 사이트를 통해 patcher 이미지를 다운로드 받자.

        . http://dosdude1.com/catalina/



2. Patcher 실행하기 #1

    - 다운로드 받은 Patcher를 실행하자


    - 권한이 필요할 수도 있다

3. Patcher 실행하기 #2

    - 이제 순탄히 진행하면 된다

    - 설치 이미지를 만들기 위해 Catalina 파일이 필요한데... 가지고 있으면 고르면 되고, 없으면 다운로드 받으면 된다. 시간 좀 걸린다.

4. Patcher 실행하기 #3

    - 다운로드 받은 Catalina 이미지 파일을 이용해서 설치용 USB 메모리를 만들면 된다

    - "Create a Bootable Installer" 메뉴를 선택하고,

    - USB 메모리 (필자는 뒤에 있는 "Untitled") 선택하면

    - USB 메모리 내용이 다 지워질 수도 있다는 내용 확인하면 된다

    - 시간이 좀 많이 소요된다 (필자의 USB 메모리가 느려서일지도?!)


5. 재부팅

    - 이제 재부팅을 하면 된다. Option키를 눌러서 부팅 옵션을 고르는 화면을 보면 된다.


6. 디스크 유틸리티

    - Catalina의 경우 APFS 파일시스템을 사용해야 한다고 한다. 그래서 "디스크 유틸리티"를 선택하면 된다.

    - 필자는 SSD + HDD 구성이기에 SSD 일부 공간을 APFS로 할당했다.

    - 반절만 할당해봤다.


7. Catalina 설치

    - 파티션 잡아줬으면, 빠져나와서 "macOS 다시 설치"를 선택하면 된다.

    - 그냥 고고씽~ 하면 된다.

    - 당연히 방금 만들어준 APFS를 설정한 디스크를 골라주면 된다.

    - 느린 USB 메모리 때문인지, 할아버지 맥북이라서인지.... 소요시간은 좀 걸렸다.

    - 1분 남았다고 거짓말 하는 우리 할아버지...

    - 대한민국 잘 골라주면 된다~

    - 개발자라면 다크 모드 !!!

    - Mid 2010 이지만... Catalina 이다~!!!


음... 솔직히 뭐가 좋아졌는지는 잘 모르겠다.

그냥 최신 macOS 사용할 수 있으니 좋을뿐~ ^^


개인적으로는 살짝 느린맛이 있기도 한데... 빨라졌다는 분들도 있는 것 보면... 뭐...


일단 여하튼 우리 할아버지 맥북프로님이 새로운 트렌드에 맞는 옷을 입었어요 !!!


반응형



지금 간만에 안드로이드 어플 개발 관련하여 포스팅을 하고 있는 이유...

갑작스레 맵... 지도 기반의 뭔가를 만들어 보고 싶어서!



그러면,

제일 먼저 해야할 일은?


구글에서 제공해주는 API를 사용할 수 있어야지!!



구글님께 허락 받으러 가보자 !!!






#01. API 프로젝트 만들기



아래 링크로 접속 고고씽~


https://console.developers.google.com/



당연히 "만들기"를 누르자~!!



조금 기다리면 생성완료된다




왼쪽 위를 보면 방금 만든 프로젝트로 설정되어 있는 것을 볼 수 있다








#02. API 및 사용 서비스 사용 설정



"+ API 및 서비스 사용 설정"을 눌러보자.



우리는 구글맵을 사용하는 안드로이드 앱을 만들거니까

따로 검색할 필요 없이 나와있는 것을 딱 고르면 된다


"Maps SDK for Android"

누르면...



"사용 설정"을 누르면 된다.



뭔가 나온다.... 있어보인다.







#03. 사용자 인증 정보 1


"사용자 인증 정보"를 눌러보자



"사용자 인증 정보 만들기"

눌러보자



"API 키"

선택하면 된다



"키 제한"

선택해야 한다



여기에서 "애플리케이션 제한사항" 부분을 설정해보자



"Android 앱"을 선택하고

밑 부분의 "+ 패키지 이름 및 지문 추가"를 선택하자


'패키지 이름'과 'SHA-1 인증서 지문'은 샘플로 들어가있다.


실제 개발 환경의 정보로 업데이트 해야한다.








#04. Create Project


위에서 필요한 정보를 입력하기 위해서는

어플리케이션 프로젝트가 필요하다


Android Studio를 실행하자



당연히

"+ Start a new Android Studio project"

선택



"Empty Activity"로 선택



'Name' 부분만 적당히 지어주면 된다.

밑의 API 부분도 그냥 그대로 놔두자~


'Finish'



뭔가 필요한걸 설치한다~


'Finish' ~



오~ 이제 좀 뭔가 프로그래머 스러운 화면이다~~~



app - src - main - java - ... 각자 환경에 따라서 ...


"MainActivity.java" 파일에 써있는 패키지만 잘 확인하면 된다.



"Build" 메뉴에서 "Make Project"를 실행해보자.


이걸 해야지 '키 저장소' 파일이 생성된다.

(SHA-1 인증서 지문 확인을 위해서 필요한...)






#05. SHA-1 인증서 지문


명령어 프롬프트 창으로 가야한다.

그리고 아래 명령어를 그대로 입력하면 된다.



> "C:\Program Files\Android\Android Studio\jre\bin\keytool" -list -v -keystore "%USERPROFILE%\.android\debug.keystore" -alias androiddebugkey -storepass android -keypass android



인증서 지문이라고 뭐라고 블라블라 나온다.


"인증서 지문:" 라인 중에서 "SHA1"이라고 나온 부분을 참조하면 된다.







#06. 사용자 인증 정보 2


패키지 이름과 SHA-1 인증서 지문을 입력하면 된다



잘 복사해서 붙여넣기~


"API 제한사항" 부분도 넣어보자



"Select API"를 클릭해서

"Maps SDK for Android"를 골라주면 된다.


그리고 저장~





#07. API 키 저장하기


이제 만들어진 API 키 값을

우리가 만들고자 하는 어플에 넣어줘야 한다




키 값을 잘 복사한 다음에...



Android Studio를 살펴보자



"manifests - AndroidManifest.xml" 파일을 찾아야 한다.


...

<uses-library android:name="org.apache.http.legacy" android:required="false"/>

<meta-data
android:name="com.google.android.geo.API_KEY"
android:value="..." />

...


<uses-library ...>, <meta-data ... >

내용을 삽입해야 한다.



그리고

위에서 준비한 API 값을 넣어주면 된다






#08. Google Play services


구글맵을 사용하기 위해서는

"Google Play services"를

설치해야한다.



"Android Studio"에서

Tools - SDK Manager

메뉴를 실행하자



"SDK Tools" 탭에서

"Google Play services" 항목을 선택 후

Apply ~



당연히 "Accept" 후 Next~







#09. build.gradle


하아~ 힘들다.



Android Studio 에서 build.gradle 을 열고선

2개 라인을 추가하자


...

implementation 'com.google.android.gms:play-services-maps:16.0.0'
implementation 'com.google.android.gms:play-services-location:16.0.0'

...


위 2줄을 넣으면 된다


변경된 라인에 마우스 포인터를 위치시켰을 때

새로운 버전이 보이면 해당 버전으로 맞춰주면 되는데,


여기에서 주의해야할 사항이 있다!!!

버전을 같이 맞춰야 한다.


implementation 'com.google.android.gms:play-services-maps:16.1.0'


위와 같이 하나만 버전을 올리니까....

App 실행을 하면, Google Play services 오류라면서 지도가 나오지 않았다.





변경한 다음에는 위와 같이 있는 "Sync Now"를 눌러주자 !!!


응?! 그런데 ?!



기분 나쁘게 빨간줄이 나온다.

뭔가 버전이 안맞는단다.


풍선팁에 나온 내용을 바탕으로 28.0.0 버전으로 맞춰주면 된다.



빨간줄이 모두 사라졌다.






#10. layout



"app - res - layout - activity_main.xml"


내용을 아래 내역으로 바꿔치기 하자


(가운데 밑의 Text로 화면을 바꿔놓고선 붙여넣기하면 된다)


<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity" >

<fragment
android:id="@+id/map"
android:layout_width="match_parent"
android:layout_height="match_parent"
class="com.google.android.gms.maps.MapFragment" />

</LinearLayout>






#11. MainActivity.java



이 부분도 아래 내역으로 붙여넣자


package com.whatwant.sallymap;

import android.app.FragmentManager;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.MapFragment;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;


public class MainActivity extends AppCompatActivity
implements OnMapReadyCallback {

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

FragmentManager fragmentManager = getFragmentManager();
MapFragment mapFragment = (MapFragment)fragmentManager
.findFragmentById(R.id.map);
mapFragment.getMapAsync(this);
}

@Override
public void onMapReady(final GoogleMap map) {

LatLng SEOUL = new LatLng(37.56, 126.97);

MarkerOptions markerOptions = new MarkerOptions();
markerOptions.position(SEOUL);
markerOptions.title("서울");
markerOptions.snippet("한국의 수도");
map.addMarker(markerOptions);

map.moveCamera(CameraUpdateFactory.newLatLng(SEOUL));
map.animateCamera(CameraUpdateFactory.zoomTo(10));
}

}


당연히 제일 위의 package 내용은 각자의 상황에 맞춰서~







#12. Run


위에 있는 메뉴 부분 중에서 중간에서 약간 오른쪽에 있는 "▷" 부분을 눌러보자



에뮬레이터로 Nexus가 보인다~ OK !!!



우앙.... 드디어 나왔다~~~~!!!!




지쳐서 일단 여기까지만... !!!







위의 내용은 전적으로 아래 포스팅 내용으로 공부하면서 진행했다.

오리지널은 아래 포스팅이다!!!


"Google Maps Android API 사용 방법 및 예제"

https://webnautes.tistory.com/647


반응형

'잘난놈되기 > 안또라이들' 카테고리의 다른 글

안드로이드 어플 개발 환경 만들기  (0) 2019.03.31
새로운 판 만들기  (0) 2012.03.12
버튼을 더 추가해보기  (0) 2012.03.11
버튼을 추가해보기  (0) 2012.03.06
첫 소스 분석 - HelloAndroid  (0) 2012.03.05


갑작스레 떠오른

'나에게 있었으면 좋을 것 같은 어플 아이디어'


오옷... 만들어봐야지~


그런데, 오랜만에 만들려니 너무 귀찮다!!!


인벤터 같은 걸로 만들까?


아... 그런데, 내가 원하는 기능을

인벤터로 하려면... 어렵거나 안될것 같은데...


그러면 정공법으로 가자!


아~ 그런데... 오랜만이다보니

기본적인 것 조차 기억도 안나고

내가 아는 내용은 out of date 된 지식인 것 같은데...


뭐... 하나씩 천천히 해보자!!!




아래 링크의 포스팅을 아주 많이 참고했다.

(감사합니다~!!!)


https://webnautes.tistory.com/1126




2019.03.24 기준



[ Android Studio 설치하기 ]


아래 경로에 접속하자


https://developer.android.com/studio/



접속한 PC 환경에 맞춰서 알아서 다운로드 링크가 나온다.



다운로드 다 받으면 설치 시작하면 된다.



뭐... 그냥 Next ~ Next 하자 ^^



한참 설치한다. 용량이 그만큼 크니깐 뭐...



설치는 다 되었지만,

이제는 환경 설정 과정이 필요하다.






[ Android Studio 환경 설정하기 ]


처음 실행하게 되면 환경설정 과정이 진행된다.



어?! 옛날에 구닥다리 버전을 설치한 적이 있었나보다.

에잇~ 우리는 깨끗하게 새로 시작하자 ^^



나도 반가워~^^



음... 이번엔 Custom으로 해보자



오옷~ 테마를 고를 수 있다!

난 어둠의 자식이니.... 드라큘라를 선택해봤다



설치할 SDK Components를 고르는 화면인데 ...

에뮬레이터를 사용하려면 아래 2개를 선택해야한다고 한다.

용량이 큰데... 뭐 그래도 어쩔 수 없이~



에뮬레이터에 할당할 메모리 용량을 셋팅하는 것 같은데...

그냥 최소 요구사항만 맞춰봤다.



에고... 이제 되었다.

Finish 를 누르면 끝이다....가 아니고,



다운로드 받고~ 압축 풀고~ 설치한다.

물론 지가 혼자 알아서... ^^



조용히 완료된다.


아래 부분의 Configure 메뉴를 통해서 업데이트도 해보자.



이제 시작할 준비는 되었다!!!





어플 하나 만들어보자~!!!




반응형

'잘난놈되기 > 안또라이들' 카테고리의 다른 글

구글맵 API 사용 준비 하기  (0) 2019.03.31
새로운 판 만들기  (0) 2012.03.12
버튼을 더 추가해보기  (0) 2012.03.11
버튼을 추가해보기  (0) 2012.03.06
첫 소스 분석 - HelloAndroid  (0) 2012.03.05

http://www.algospot.com/judge/problem/read/ENDIANS

위 문제를 풀기 위해서 기본 사항들에 대해서 공부를 해보기로 했다.

이런 공부를 해본지 벌써 10여년 이상이 흘러버린 것이 좀 슬프게 느껴진다.
어휘들은 낯이 익지만 그 의미는 가물가물한 단계를 넘어 다른 사람에게 설명을 할 수가 없는 지경이...



□ Little-Endian, Big-Endian

   - 메모리에 저장된 바이트들의 순서에 대한 용어
     ▷ Big-Endian
          * 바이트 열에서 가장 큰 값이 먼저 저장
          * RISC 기반 프로세서, 모토로라 프로세서
          * 확장 축소에 효율적
          * 수의 값을 증가시킬 때 왼편에 자릿수 추가 가능
     ▷ Little-Endian
          * 바이트 열에서 가장 작은 값이 먼저 저장
          * 인텔 프로세서, DEC의 알파 프로세서
          * 오른쪽에서 왼쪽으로 읽는 언어를 사용하는 사람에게 자연스러운 방식

 Type Name  Size  Value  Big-Endian  Little-Endian 
 BYTE  b  1  0x12 [12]  [12] 
 WORD  w  2  0x1234 [12][34]  [34][12] 
 DWORD  dw  4  0x12345678 [12][34][56][78]  [78][56][34][12] 
 char []  str  6  "abcde" [61][62][63][64][65][00]  [61][62][63][64][65][00] 

     ▷  위키피디아에 너무나 좋은 그림이 있어서 이것도 추가해본다.
          * http://en.wikipedia.org/wiki/Endianness




   - 당연히 모두 알고있겠지만, char []의 경우에는 제일 끝에 null이 들어가게 되고, 순서의 바뀜이 없다.

   - MSB, LSB
      ▷ MSB (Most Significant Bit) : 최상위 비트. 이진수 숫자 중에서 제일 큰 자리수
      ▷ LSB (Least Significant Bit) : 최하위 비트. 이진수 숫자 중에서 마지막 자리수
(MSB) 0x12345678 (LSB)
      ▷ MSB First System → 12 34 56 78
      ▷ LSB First System → 78 56 34 12

   - 용어만 다를 뿐이지, 결국은 같은 이야기이다.
      ▷ Little Endian = LSB First
      ▷ Big Endian = MSB First

   - 이 단어들은 걸리버 여행기에서 나오는 이야기에서 유래가 되었다고 한다.
     ▷ 삶은 계란을 깰 땨애 뾰족한 쪽(Little-endian)으로 깨야한다는 릴리풋(Lilliput) 국과
         둥근 쪽(Big-endian)으로 깨야한다는 비에푸스쿠(Biefuscu) 국이 전쟁을 일으켰다는...

   - 또, 당연한 이야기이지만 Big-endian, Little-endian 모두 같은 값을 표한하기 위한 다른 방법일 뿐이다.




□ 시프트 연산 (Shift Operations)

   - 앞서 살펴본 Big-endian, Little-endian을 프로그램으로 구현할 때에 주로 사용하는 것이 바로 시프트 연산 !

   - 우선은 C/C++ 언어에서의 시프트 연산을 기준으로 해서 알아보자.
     ▷ 기본적인 문법은 다음과 같다.
        * 데이터 << 이동할 비트 수
        * 데이터 >> 이동할 비트 수
     ▷ 하나 샘플로 해보자.
        * int number = 5;
        * int result = number << 3;

        * 5를 2진수로 하면... 101
        * 왼쪽으로 3번 시프트 연산을 하면... 101000
        * 그러므로... result 결과는 40

        * result = result >> 1;

        * 101000 ... 이걸 오른쪽으로 1번 시프트하면... 10100
        * 이건... 결과로 20

     ▷ 시프트 연산을 하다보면 두 가지 상황에 대해서 잘 생각해보아야 한다.
     ▷ 제일 왼쪽의 비트가 부호 비트인데, 부호 비트까지 왼쪽 시프트가 이루어지는 경우와
     ▷ 오른쪽 시프트가 이루어지다가 버림이 벌어지는 경우가 그것인데...

     ▷ 왼쪽 시프트
        * 값이 2배씩 증가를 한다.
        * 음수여서 부호비트가 1인 경우 바로 0으로 바뀌어서 양수로 되기도 하고,
          양수의 값이 시프트 되다가 갑자기 음수로 바뀔 수도 있다.
        * 제일 오른쪽은 "0"으로 채워진다.

     ▷ 오른쪽 시프트
        * 값을 2의 제곱으로 나누기를 한다.
        * 제일 왼쪽은 부호비트로 채워진다. 음수이면 계속 1이 들어온다.
        * 제일 오른쪽으로 넘어오는 값들은 그냥 그대로 버려진다.

   - 시프트 연산에 있어서는 Python에서도 기본적인 문법은 동일하다.




□ 비트 연산 (Bit Operations)

   - 본래 시프트 연산 역시도 비트 연산에 포함이 된다.
   - 시프트 연산 외에 지금 살펴볼 비트 연산자는 "and", "or", "xor"  3가지 이다.

   - 여기에서 일일이 하나씩 설명하지는 않겠다.
   - 비트 단위로 연산이 이루어지는 것이며, 문법은 다음과 같다.
     * and : &
     * or   : |
     * xor : ^




□ 함수 구현

   - 일단은 문제를 검증하기 위한 코드 작성

#include <stdio.h>
#include <stdint.h>

uint32_t to_little(uint32_t bits32)
{
        unsigned char bytes[4];
        uint32_t ret;

        bytes[0] = (unsigned char)((bits32 >>  0) & 0xff);
        bytes[1] = (unsigned char)((bits32 >>  8) & 0xff);
        bytes[2] = (unsigned char)((bits32 >> 16) & 0xff);
        bytes[3] = (unsigned char)((bits32 >> 24) & 0xff);

        ret = ( (uint32_t)bytes[0] <<  0 ) |
              ( (uint32_t)bytes[1] <<  8 ) |
              ( (uint32_t)bytes[2] << 16 ) |
              ( (uint32_t)bytes[3] << 24 );

        return ret;
}

uint32_t to_big(uint32_t bits32)
{
        unsigned char bytes[4];
        uint32_t ret;

        bytes[0] = (unsigned char)((bits32 >>  0) & 0xff);
        bytes[1] = (unsigned char)((bits32 >>  8) & 0xff);
        bytes[2] = (unsigned char)((bits32 >> 16) & 0xff);
        bytes[3] = (unsigned char)((bits32 >> 24) & 0xff);

        ret = ( (uint32_t)bytes[0] << 24 ) |
              ( (uint32_t)bytes[1] << 16 ) |
              ( (uint32_t)bytes[2] <<  8 ) |
              ( (uint32_t)bytes[3] <<  0 );

        return ret;
}

int main()
{
        uint32_t i = 2018915346;

        printf("[ %u ]\n", i);
        printf("        %u\n", to_little(i));
        printf("        %u\n", to_big(i));


        i = 1;

        printf("[ %u ]\n", i);
        printf("        %u\n", to_little(i));
        printf("        %u\n", to_big(i));


        i = 100000;

        printf("[ %u ]\n", i);
        printf("        %u\n", to_little(i));
        printf("        %u\n", to_big(i));


        i = 4294967295u;

        printf("[ %u ]\n", i);
        printf("        %u\n", to_little(i));
        printf("        %u\n", to_big(i));

        return 0;
}


반응형

+ Recent posts