2016년 1월 19일 화요일

비트 연산자와 시프트 연산자

C,C++ 에도 있고, 대충은 아는 비트 연산자와 시프트 연산자를 정리하는 이유는,
C 와는 달리 자바에는 시프트 연산자에 >>> 가 있기 때문이다.
<비트 연산자>
컴퓨터 내부의 정보를 비트 단위로 비교하거나 조작할때 사용한다.
○ 논리곱(and) &
각 비트를 비교하여 양쪽 모두 1 이면 1, 아니면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a&b = 1 0 1 0 0 0 0 0
10진수로 바꾸면 160 이 된다.

○ 논리합(or) |
각 비트를 비교하여 어느 한쪽이 1 이면 1, 그렇지 않으면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a|b = 1 1 1 1 1 1 1 1
10진수로 바꾸면 255 가 된다.

○ 배타적 논리함(xor) ^
각 비트를 비교하여 한쪽이 1 이고 다른 한쪽이 0 이면 1을, 아니면 0 을 반환한다.
a = 170, b = 245 일때
a   = 1 0 1 0 1 0 1 0
b   = 1 1 1 1 0 1 0 1
a^b = 0 1 0 1 1 1 1 1
10진수로 바꾸면 95가 된다.

○ 1의 보수 표현(not) ~
각 비트를 반전시킨 값을 반환한다.
a = 170 일때
a   = 1 0 1 0 1 0 1 0
~a  = 0 1 0 1 0 1 0 1
10진수로 바꾸면 85 가 된다.

<시프트 연산자>
비트 열을 좌우로 지시한 만큼 이동시키는(shift) 연산자를 말한다.
C 에도 시프트 연산자가 있는데, C 에는 >> 과 << 만 있으나,
자바에는 추가적으로 >>> 연산자도 있다.
○ 왼쪽 시프트 연산자 <<
178 << 2 : 178 의 이진코드를 왼쪽으로 2비트 시프트 한다.
  10110010
1011001000
왼쪽으로 두칸 밀면서, 비게 되는 오른쪽 두칸은 0 으로 채운다.
그런데, 문제는 왼쪽으로 밀면서 기존의 크기를 넘어서기 때문에 왼쪽으로 넘어선 2개의 비트는 삭제된다.
따라서, 10110010 을 왼쪽으로 밀면 왼쪽 두개 비트인 10 은 삭제되고, 오른쪽의 2개 비트는 0으로 채워져
결과값은 11001000 이 된다.

○ 오른쪽 시프트 연산자 >>
178 >> 2 : 178의 이진코드를 오른쪽으로 2 비트 시프트 한다.
10110010
1110110010
오른쪽으로 2비트 이동한후, 비게되는 왼쪽의 2개비트는 1로 채워지고, 오른쪽에서 2비트 넘어간 부분은 삭제된다.
따라서, 10110010 을 오른쪽으로 2비트 시프트하면, 11101100 이 된다.
그런데, 주의할점은, 오른쪽으로 밀면서 왼쪽에 비게되는 비트부분이 무조건 1 로 채워지는 것이 아니라,
밀기전의 최초 첫째자리 값과 동일한 값으로 채워진다는 것이다.
여기에서는 밀기전의 첫째자리값이 1 이었으므로, 1 로 채워진 것이다.
○ 논리 오른쪽 시프트 연산자 >>>
178 >>> 2 : 오른쪽으로 2 비트 시프트한다.
자바에 추가된 논리 시프트는 오른쪽으로 밀면서 비게되는 앞쪽 비트를 무조건 0 으로 채워넣는 것이다.
10110010
0010110010
으로 되는 것으로,
역시 오른쪽으로 밀려난 2개 비트 10 은 삭제되고, 비게되는 왼쪽 2비트는 무조건 0으로 채워진다.
따라서 10110010 을 오른쪽으로 논리 시프트 하면, 00101100 이 된다.
예시)
--------------------------------------
public class a{
  public static void main(String [] args){
    byte a = 10;  // 00001010
    byte b = 9;   // 00001001
    byte c = 1;  //시프트할 칸수
    System.out.println(a + " & " + b + " = " + (a&b));  //논리합
    System.out.println(a + " | " + b + " = " + (a|b));  //논리곱
    System.out.println(a + " ^ " + b + " = " + (a^b));  //배타적 논리합(xor)
    System.out.println("~10 = " + (~a));  //a 의 보수(반전)
    System.out.println(a + " << " + c + " = " + (a<<c));  //왼쪽 1비트 시프트(뒤를 0 으로 채움)
    System.out.println(a + " >> " + c + " = " + (a>>c));  //오른쪽 1비트 시프트(앞을 밀리기전 첫째자리와 동일한 비트로 채움)
    System.out.println(a + " >>> " + c + " = " + (a>>>c)); //오른쪽 1비트 논리 시프트(앞을 0 으로 채움)
    System.out.println(-1 * a + " >> " + c + " = " + (-1*a >> c));
  }
}
--------------------------------------
/*
출력:
10 & 9 = 8    : 00001000
10 | 9 = 11   : 00001011
10 ^ 9 = 3    : 00000011
~10 = -11     : 11110101
10 << 1 = 20  : 00010100
10 >> 1 = 5   : 00000101
10 >>> 1 = 5  : 00000101
-10 >> 1 = -5 : 11111011
*/
부호가 붙은 정수형에서는 최상위 비트를 부호비트로 사용한다.
0 은 + 를 표시하고, 나머지 비트로 수를 표시한다.
1은 - 를 표시 하고, 나머지 비트를 반전하여 1 을 더한값이 절대값이 된다.

----------------------------------------
쉬프트연산자 >>, >>> 차이점이요.

양의 숫자를 쉬프트 시킬때는 차이가 없습니다.

하지만 음의 숫자는 2진수로 표시할때 맨앞에 부호비트 1이 붙습니다.

>>연산자의 경우는 부호비트는 고정되고 쉬프트 되지만
>>>연산자는 부호비트도 함께 쉬프트가 됩니다.

ex) 

System.out.println(-300>>>2);
System.out.println(-300>>2);

실행시키면 

1073741749 
-75

가 됩니다.

Last Index Of in MS Office Excel

[구분]  엑셀 함수
[내용] 특정 문자를 뒤에서부터 검색하여 치환한다.
SUBSTITUTE의 특정 위치의 문자만을 치환하는 기능을 이용한다.

사용 함수 : 


LEN - 문자의 갯수를 가져온다. 
LEN(text) 
e.g. LEN("excel") = 5
SUBSTITUTE - 특정 문자를 치환한다.
SUBSTITUTE(text, old_text, new_text, [instance_num]) 
e.g.1 SUBSTITUTE("contact","ta","ne") = connect 
e.g.2 SUBSTITUTE("good","o","",2) = god

사용 설명 : 

1. 특정 문자를 공백으로 치환한다.
SUBSTITUTE(A1,"\","")
2. 특정 문자를 공백으로 전부 치환한 문자의 갯수와 원래 문자의 갯수의 차이를 구한다.
    이 숫자가 특정 문자의 빈도 수 이다.
LEN(A1) - LEN( SUBSTITUTE(A1,"\","") )
3. 기준 문자에서 마지막에 있는 특정 문자만을 치환한다.
SUBSTITUTE(A1, "\", "/", LEN(A1) - LEN( SUBSTITUTE(A1,"\","") ) )

예시 :





주의 : SUBSTITUTE 는 영문 대 소 문자를 구분함.



2015년 8월 19일 수요일

OS X 에서 NTFS 읽기

OS X 에서 NTFS 읽기

두 가지 방법이 있다.

1. 프로그램 설치
    http://www.enjoygineering.com/mounty/

2. 운영체제에서 가능하도록 하기
    NTFS 형식의 외장하드를 연결 후
    터미널을 통해 file system table 접근  [ sudo nano /ect/fstab ]
    팝업되는 편집기에 type [ LABEL=myNTFS none ntfs rw,auto,nobrowse ]
        * myNTFS 는 외장하드 이름이므로 변경가능
        * 대 소문자 구분함
    저장 [ control - O ]
    닫기 [ control - X ]
    NTFS 형식의 외장하드 추출
    NTFS 형식의 외장하드 재 연결
    Finder 에서 연결되었는지 확인해 보고 없으면 터미널에서 type [ open /Volumes ]

참고 :
    FAT (File Allocation Table)
        FAT12, FAT16, FAT32, FATX, exFAT(FAT64), Turbo FAT, TFAT, tex FAT
        거의 모든 운영체제를 지원한다.
        느리다....... 적은 용량의 파일이 많으면 디스크 공간 활용 능력이 더 떨어진다.
    NTFS (New Technology File System)
        v1.0, v1.1, v1.2(NT 3.51, NT 4), v3.0(Windows 2000),
         v3.1(Windows XP, Windows Server 2003, Windows Vista,
                Windows Server 2008, Windows 7)
        MS 윈도우즈 계열에서만 사용가능하다.
        시스템 고장과 디스크 손상을 복구하는 능력이 있다.
             

2015년 8월 5일 수요일

XML parsing with JAVA

XML을 JAVA에서 Parsing 하다.....
일단 xml은..
<code-define>
    <red>
        <code>1100</code>
        <code>1100</code>
        <code>1100</code>
    </red>
    <green>
        <code>1100</code>
        <code>1100</code>
        <code>1100</code>
    </green>
</code-define>
코드값을 자바의 배열로 넣고자 합니다.

// w3c 의 DOM을 사용합니다.
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.NodeList;

// 일단 값을 넣을 배열을 선언하고
List<String> redCodesFromXML = new ArrayList<String>();
List<String> greenCodesFromXML = new ArrayList<String>();

// DOM 문서를 준비합니다.
DocumentBuilderFactory docBF = DocumentBuilderFactory.newInstance();

// xml parsing 을 준비합니다.
DocumentBuilder docB = docBF.newDocumentBuilder();

// 이제 xml 받을 준비
String fileLocation = "C:/test.xml";Document xmlDoc = null;

// parsing
xmlDoc = docB.parse(fileLocation);

// 최 상위 태그를 엘레멘트로 불러옵니다. 태그이름은 code-define 이 됩니다.
Element root = xmlDoc.getDocumentElement();

// red를 엘레멘트 형식으로 가져옵니다. red 태그가 하나밖에 없다고 뒤에 item(0) 이거 무시하면 에러 납니다.
Element red = (Element) root.getElementsByTagName("red").item(0);

// 이제 code를 노드 리스트로 가져옵니다.
NodeList codeValueForRed = red.getElementsByTagName("code");


// for 문으로 리스트 배열에 넣습니다.
for(int i=0; i < redCodesFromXML; i++){
   redCodesFromXML.add(codeValueForRed.item(i).getTextContent());
}


// 이걸 String-array로 바꾸고 싶다면
String [] redStringArray = redCodesFromXML.toArray(new String[redCodesFromXML.size()]);





이상입니다.




2015년 8월 3일 월요일