다재다능한 프로그래머는 비트 단위 연산에 얼마나 능숙해야합니까? [닫은]


34

나는 최근에 OpenJDK 코드를 탐색 하고 비트 연산 과 관련된 흥미로운 코드를 발견 했습니다 . 심지어 StackOverflow에서 그것에 대해 질문 했습니다.

요점을 보여주는 또 다른 예는 다음과 같습니다.

 1141       public static int bitCount(int i) {
 1142           // HD, Figure 5-2
 1143           i = i - ((i >>> 1) & 0x55555555);
 1144           i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
 1145           i = (i + (i >>> 4)) & 0x0f0f0f0f;
 1146           i = i + (i >>> 8);
 1147           i = i + (i >>> 16);
 1148           return i & 0x3f;
 1149       }

이 코드는 Integer 클래스 에서 찾을 수 있습니다 .

나는 이것을 볼 때 어리석은 느낌을 줄 수 없습니다. 나는 대학에서 한 두 학급을 그리워 했습니까 아니면 이것이 내가 얻는 것이 아닌가? ANDing, ORing, XORing, shifting과 같은 간단한 비트 단위 연산을 수행 할 수는 있지만 위와 같은 코드를 어떻게 작성합니까?

다재다능한 프로그래머는 비트 단위 연산에 얼마나 능숙해야합니까?

참고로 ... 걱정스러운 점은 StackOverflow에서 내 질문에 답변 한 사람이 몇 분 안에 답변했다는 것입니다. 그가 그렇게 할 수 있다면 왜 전조등에서 사슴처럼 쳐다 봤습니까?


4
어떤 유형의 개발 작업을 수행하고 있습니까 (또는 지금 수행하지 않는 경우 수행하려는 작업)? 나는 이것이 웹 개발에 유용하지는 않지만 임베디드 시스템에서 많은 비트 연산이 작동하는 것을 보았습니다.
Thomas Owens

26
사용자 인터페이스 개발 또는 웹 개발을 위해 누군가를 고용하고 있다면 비트 조작은 내가 물어볼 것이 아닙니다. 그러나 네트워크 프로토콜, 임베디드 시스템 및 장치 드라이버를 사용하는 사람이 익숙 할 것으로 기대합니다.
Thomas Owens

11
지상 >>>에서 운영자 는 무엇입니까 ?
DeadMG

10
@DeadMG : 부호없는 오른쪽 시프트. download.oracle.com/javase/tutorial/java/nutsandbolts/op3.html
c_maker

3
// HD, Figure 5-2내가 볼 첫 번째 것입니다. 파일 시작 부분의 주석에 따르면 HD입니다 Henry S. Warren, Jr.'s Hacker's Delight.
schnaader

답변:


38

다재다능한 개발자 는 연산자와 비트 단위 연산 을 이해해야 한다고 말합니다 .

따라서 최소한 약간의 생각 후에 위의 코드를 파악할 수 있어야합니다.

비트 단위 작업은 수준이 낮은 경향이 있으므로 웹 사이트 및 LOB 소프트웨어에서 작업하는 경우 많이 사용하지 않을 수 있습니다.

다른 것들과 마찬가지로, 많이 사용하지 않으면 그들에게 모순되지 않을 것입니다.

따라서 누군가가 이런 종류의 코드로 많은 작업을하므로 매우 빨리 알아낼 수 있다는 것에 대해 걱정 하지 않아도됩니다. OS 코드, 드라이버 코드 또는 기타 까다로운 비트 조작을 작성했을 수 있습니다.


1
+1 : 비트 단위 연산은 모든 개발자에게 중요한 지식 (말장난이 아님)이지만 지금은 특정 상황 에서만 매우 중요합니다. 당신이 당신의 일상에서 그들을 만난 적이 없다면, 일반적인 지식을 갖는 것이 그들을 노예로 만드는 것보다 낫습니다. 뇌 공간을 자유롭게 유지하십시오.
Nicholas Smith

또한 사용시기를 이해하고 문제에 대한 올바른 해결책 인 경우 사용을 피하십시오.
user606723

@ user606723의 의견에 추가하기 위해 비트 비트 항목이 일반적으로 사용되고 거의 또는 거의 발생 하지 않는 몇 가지 장소 가 있습니다-해시 (및 관련 항목) 및 RGB의 특정 색상 추출 / 설정 에 저장됩니다 int. 예를 들어, 특정 레지스터에서 리턴 된 비트 플래그를 검사하여 CPU 정보를 읽을 수 있지만, 이는 asm을 포함하며 필요한 경우 일반적으로 높은 lvl 래퍼를 갖습니다.
TC1

36

이 같은 문제를 해결하는 방법을 이해한다면 당신은 확인 비트 연산자에 대한 이해의 부족이 "정수 값은 비트 7-12으로 표시"명확한 비트 5 "비트 3, 8 세트 있는지 확인" "또는"찾을 수 있습니다 "반올림"체크리스트의 트위들 비트 상자.

귀하의 예는 정수와 같은 작은 비트의 데이터를 조작하기위한 고성능 알고리즘의 컴파일 인 Hacker 's Delight 에서 제공됩니다 . 이 코드를 작성한 사람은 원래 5 분 안에 코드를 뱉어 내지 않았습니다. 비하인드 스토리는 비트를 계산할 수있는 빠르고 분기가없는 방법이 필요했을 가능성이 높으며 저자는 비트 열을 응시하고 문제를 해결하는 방법을 준비하는 데 시간을 보냈습니다. 그들이 본 적이 없다면 아무도 그것이 어떻게 작동하는지 한눈에 이해할 수 없습니다. 비트 단위의 기본 사항을 잘 이해하고 코드를 실험하는 데 시간이 걸리면 코드의 기능을 파악할 수 있습니다.

이러한 알고리즘을 이해하지 못하는 경우에도 알고리즘이 존재한다는 사실만으로도 "반올림"에 추가됩니다. 예를 들어 고성능 비트 카운팅을 처리 할 때 연구 대상이 무엇인지 알기 때문입니다. Google 이전의 세계에서는 이런 것들을 찾기가 훨씬 어려웠습니다. 이제 키를 눌렀습니다.

귀하의 SO 질문에 대답 한 사용자는 해싱 이전에 문제가 있거나 해킹을 연구했을 수 있습니다. 그를 작성하고 물어보십시오.


적어도 이런 것들을 알고 있으면 +1합니다. 많은 것을 조금 아는 것이 좋습니다. 업계의 사람들이 이와 같은 것에 대해 이야기하기 시작하면, 논의중인 내용을 조금도 모르는 방에있는 사람이되고 싶지 않습니다.
maple_shaft

3
위의 코드 주석에서 약어 "HD"를 해결하기 위해 +1
Péter Török

나는 이런 종류의 것들을 좋아하고 HD 책을 주문했습니다. 참조 주셔서 감사합니다.
tcrosley 2016 년

8

당신의 모범에서 실제로 생각하지 않고 반드시 알아야 할 것이 있습니다.

1143 i = i-((i >>> 1) & 0x55555555);

비트 패턴 0x555 ...를 번갈아 비트 패턴 0101 0101 0101로 인식하고 연산자가 1 비트 (오른쪽)만큼 오프셋하고 &는 마스킹 작업 (및 마스킹의 의미)임을 인식해야합니다.

1144 i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);

다시 한 번, 패턴은 0011 0011 0011입니다. 또한 이번에는 두 번 이동하고 다시 마스킹합니다. 시프 팅과 마스킹은 인식해야 할 패턴을 따릅니다.

1145 i = (i + (i >>> 4)) & 0x0f0f0f0f;

패턴이 굳어집니다. 이번에는 00001111 00001111이며 물론 이번에는 4로 이동합니다. 마스크의 크기만큼 이동할 때마다.

1148 (주) 아이오 아이

다른 비트 패턴, 3f는 0의 블록에 이어 1의 큰 블록이 따른다.

"잘 둥글게"된다면이 모든 것들이 한눈에 분명해집니다. 당신이 그것을 사용한다고 생각하지 않더라도, 이것을 모른다면 코드를 크게 단순화 할 수있는 기회를 놓칠 것입니다.

더 높은 수준의 언어에서도 비트 패 터는 더 작은 양의 데이터를 더 작은 필드에 저장하는 데 사용됩니다. 그렇기 때문에 게임에서 항상 127/8, 63/4 및 255/6의 한계를 볼 수 있습니다. 필드를 포장하지 않고 열 배만큼 사용하도록 강요해야하는 많은 것들을 저장해야하기 때문입니다. 메모리 양. (어쨌든, 배열에 방대한 수의 부울을 저장해야한다면, 생각하지 않았을 때 사용할 때보 다 32-64 배의 메모리를 절약 할 수 있습니다. 대부분의 언어는 부울을 다음과 같이 구현합니다. 이 수준에서 편안하지 않은 단어는 단순히 알 수없는 것이 무서워서 이와 같은 데이터를 저장할 수있는 기회에 저항합니다.

또한 압축 된 형식으로 네트워크를 통해 전달 된 패킷을 수동으로 구문 분석하는 것과 같은 일을 피할 수 있습니다. 이를 위해서는 1k 패킷이 필요한 게임에서 200 바이트가 필요하며, 작은 패킷은 네트워크를보다 효율적으로 슬라이드하고 대기 시간을 줄이고 더 빠른 상호 작용 속도를 가능하게합니다 (게임에서 완전히 새로운 플레이 모드를 가능하게 할 수 있음).


5

비디오 프레임 조작 소프트웨어에서 코드를 본 적이 있기 때문에 코드를 인식했습니다. 오디오 및 비디오 코덱, 네트워킹 프로토콜 또는 칩 레지스터와 같은 작업을 정기적으로 수행했다면 비트 단위 연산이 많이 발생하고 제 2의 특성이됩니다.

작업이 해당 도메인과 매우 자주 일치하지 않는 경우 기분 나쁘지 않아야합니다. 나는 비트 단위 연산을 잘 알고 있지만 레이아웃과 가중치 및 확장에 대한 모든 단점 때문에 다른 사람에게는 제 2의 본성이 있기 때문에 GUI를 작성해야하는 드문 경우에는 속도가 느려집니다. 당신의 강점은 당신이 가장 경험이 많은 곳입니다.


4

알아야 할 주요 사항은 정수를 표현하는 방법 (일반적으로 길이가 플랫폼에 따라 달라지는 고정 길이 비트 벡터)과 사용 가능한 연산입니다.

주요 산술 연산 + - * / %은 마이크로 최적화에 유용 할 수는 있지만 이해할 필요없이 이해할 수 있습니다 (컴파일러는 대부분 처리 할 수 ​​있습니다)

비트 조작 세트 | & ~ ^ << >> >>>는 그것을 사용할 수 있도록 최소한의 이해가 필요합니다.

그러나 대부분의 경우 비트 플래그를 메소드에 OR함께 전달하고 int를 전달한 다음 AND긴 매개 변수 목록에서 여러 (최대 32) 부울을 전달하는 것보다 설정을 읽을 수 있도록 비트 플래그를 메소드에 전달하는 데만 사용됩니다. 인터페이스를 변경하지 않고 변경할 수있는 플래그

부울은 일반적으로 플래그와 같이 함께 묶지 않고 바이트 또는 정수로 별도로 유지됩니다.


코드 스 니펫은 비트의 병렬 카운트를 수행하여 알고리즘을 실행할 수 있습니다. O(log(n))여기서 n은 순진 루프 대신 n이 비트 수입니다.O(n)

첫 번째 단계는 가장 단단한 이해하는 것입니다하지만 당신은 비트 시퀀스 교체해야한다는 설정에서 시작하는 경우 0b00에를 0b00, 0b010b01, 0b100b010b110b10가 따라하기 쉬워진다

첫 번째 단계에서 i - ((i >>> 1) & 0x55555555)우리 i가 같으면 0b00_01_10_11이것의 결과는0b00_01_01_10

( 0x5과 동일 함 0b0101)

IUF 우리가 가지고 난 = 0b00_01_10_11이 수단 0b00_01_01_10 - (0b00_00_11_01 & 0b01_01_01_01)입니다 0b00_01_10_11 - 0b00_00_01_01차례가되는을0b00_01_01_10

그들은 (i & 0x55555555) + ((i >>> 1) & 0x55555555)같은 결과를 위해 할 수 있었지만 이것은 1 추가 작업입니다

다음 단계는 비슷한 맥락에 있습니다.


4
이 코드의 가장 중요한 품질은 분기가 없으므로 복잡성 감소보다 더 큰 이점을 제공한다는 것입니다.
Simon Richter

3

모든 사람은 기본적인 비트 단위 연산을 이해해야합니다. 많은 연습이 필요한 최적화되고 강력한 방법으로 작업을 수행하는 것이 기본 작업의 구성입니다.

물론 일상적인 비트 조작을하는 사람들 (내장 된 사람들처럼)은 강한 직관력과 멋진 트릭을 개발할 것입니다.

저수준 물건을하지 않는 프로그래머는 비트 단위 조작에 얼마나 많은 기술을 가져야합니까? 붙여 넣기와 같은 스탠자와 함께 앉아서 티저 또는 퍼즐처럼 천천히 작업 할 수있을 정도로 충분합니다.

마찬가지로, 임베디드 개발자는 웹 개발자가 비트 단위 조작에 대해 이해하는 것처럼 http에 대해 많은 것을 이해해야한다고 말하고 싶습니다. 즉, 비트를 항상 사용하지 않으면 비트 조작시 위즈가되지 않는 것이 "OK"입니다.


3
실제로 임베디드 프로그래머는 웹 개발자보다 http에 대해 더 많이 이해해야합니다 (두 가지 모두 수행). 웹 개발을 수행하는 경우 일반적으로 일부 유형의 프레임 워크를 사용할 수 있습니다. 인터넷에 연결된 장치로 작업하는 임베디드 개발자로서 http 스택을 처음부터 코딩해야했습니다.
tcrosley 2016 년

@ tcrosely, 그렇습니다. 정확합니다. 아마도 "http"보다 더 좋은 예는 "ORM"또는 "JEE"와 같은 것일 수 있습니다. 요점은 일반적으로 정기적으로 연습하지 않으면 어떤 주제에 대해 숙달 할 수 없다는 것입니다.
Angelo

동의합니다. ORM 또는 JEE를 처리 할 필요가 없습니다 (J2ME라고했을 때 JME 만 다시 사용).
tcrosley


3

비트 연산자는 해석하기가 얼마나 어렵습니까?

임베디드 시스템을 프로그래밍합니다. 나는이 물건을 많이 연습했습니다. 코드가있는 해시 맵에 대한 링크 된 질문

static int hash(int h) {
   // This function ensures that hashCodes that differ only by
   // constant multiples at each bit position have a bounded
   // number of collisions (approximately 8 at default load factor).
   h ^= (h >>> 20) ^ (h >>> 12);
   return h ^ (h >>> 7) ^ (h >>> 4);
}

코드를 큰 소리로 지시하는 데 걸리는 한 설명 된 이벤트 bitCount는 즉시 명확하지만 실제로 비트를 계산하는 이유를 해결하는 데 1 분이 걸립니다. 그러나 주석은 훌륭하고 코드가 해시 문제보다 약간 어려워하는 것을 이해하게 만듭니다.

코드를 읽고 이해하는 것을 구분하는 것이 중요합니다. bitCount코드 를 해석하고 그 기능을 읽을 수는 있지만 작동하는 이유 또는 작동하는 이유는 1 분 정도 걸릴 수 있습니다. 코드를 부드럽게 읽을 수있는 것과 코드가 왜 그런지 이해하는 것에는 차이가 있습니다. 일부 알고리즘은 간단합니다. 무엇hash코드는 의미했으나 코멘트를 설명 하는 이유 무슨 짓을하고 있었다. 비트 연산자를 사용하는 함수를 이해하기 어려우면 실망하지 마십시오. 형식에 관계없이 까다로운 수학 작업을 수행하는 데 자주 사용됩니다.

유추

나는이 물건에 익숙하다. 내가 익숙하지 않은 한 가지 주제는 정규식입니다. 나는 때때로 빌드 스크립트에서 다루지 만 일상적인 개발 작업에서는 결코 다루지 않습니다.

정규식의 다음 요소를 사용하는 방법을 알고 있습니다.

  • [] 캐릭터 클래스
  • *, .+와일드 카드
  • 문자열의 시작과 문자열의 ^$
  • \ d, \ w 및 \ s 문자 클래스
  • / g 플래그

이것은 간단한 쿼리를 작성하기에 충분하며, 내가 본 많은 쿼리는 이것에서 멀어지지 않습니다.

이 목록에없는 것은 치트 시트에 도달하는 것입니다. ,을 제외하고 아무것도, {}그리고 ()치트 시트는 충분하지 않습니다 -. 나는이 사람들에 대해 화이트 보드, 참조 매뉴얼 및 동료가 필요하다는 것을 알기에 충분합니다. 미친 알고리즘을 몇 줄의 짧은 정규식으로 묶을 수 있습니다.

알려진 요소 목록에없는 것을 요구하거나 제안하는 정규 표현식을 디자인하기 위해 인식하고 테스트 스위트에 넣을 것으로 예상되는 모든 입력 클래스를 나열합니다. 나는 많은 간헐적 단계를 통해 천천히 그리고 점진적으로 정규 표현식을 작성 하고이 단계를 소스 제어에 적용하거나 주석에 남겨 두어 나중에 중단 될 때 발생하는 일을 이해할 수 있습니다. 프로덕션 코드 인 경우 더 많은 경험을 가진 사람이 검토하도록합니다.

비트 연산자를 사용하는 곳입니까?

그래서 당신은 잘 둥글게되고 싶어?

내 추정에 따르면, 종이를 꺼내거나 화이트 보드로 이동하여 수동으로 작업을 수행하여 이와 같은 코드가 무엇인지 해석 할 수 있다면 다재다능한 자격이 있습니다. 비트 단위 작업 영역에서 잘 다듬어 진 프로그래머 자격을 갖추려면 다음 네 가지를 수행 할 수 있어야합니다.

  1. 읽고 유동적으로 일반적인 작업을 쓸 수
    응용 프로그래머, 비트 연산자와 일반적인 작업의 기본 연산자를 포함 |하고 &설정하고 명확한 플래그에 있습니다. 이것은 쉬워야한다. 다음과 같은 것을 읽고 쓸 수 있어야합니다.

    open('file', O_WRONLY | O_APPEND | O_CREAT );
    // Use an OR operator ^ here and ^ here to set multiple flags
    

    속도를 줄이지 않고 ( 플래그의 의미 를 알고 있다고 가정 ).

  2. 일부 작업으로 더 복잡한 작업을 읽을 수 있습니다.
    분기없이 O (log (n)) 시간에 비트 수를 빠르게 계산하여 hashCodes의 충돌 횟수가 제한된 양만큼 다를 수 있으며 전자 메일 주소 , 전화 번호 또는 정규 표현식이 포함 된 HTML 은 어려운 문제입니다. 이 분야의 전문가가 아닌 사람이 화이트 보드에 접근하는 것이 합리적이며, 이해하기 위해 노력할 수없는 것은 합리적입니다.

  3. 많은 작업으로 복잡한 알고리즘을 작성할 수
    있습니다. 전문가가 아닌 경우 복잡하고 어려운 작업을 수행 할 수있을 것으로 기 대해서는 안됩니다. 그러나 좋은 프로그래머는 지속적으로 작업하여 작업을 수행 할 수 있어야합니다. 이 작업을 충분히 수행하면 곧 전문가가 될 것입니다. :)


2

괜찮은 대학에 갔다면 이산 수학 수업을 들었어야했을 것입니다. 이진, 8 진 및 16 진 산술 및 논리 게이트를 배웠을 것입니다.

그 노트에 혼란스러워하는 것이 일반적입니다. 웹 응용 프로그램을 주로 작성하기 때문에 위로가되는 경우 주로 이와 같은 코드를 보거나 작성할 필요는 없지만 이진 산술과 비트 연산자의 동작을 이해하기 때문에 나는 충분한 시간이 주어지면 여기서 무슨 일이 일어나고 있는지 알아낼 수 있습니다.


2

휴대폰 프로그래머로서 이런 종류의 일을 처리해야했습니다. 장치에 메모리가 많지 않거나 전송 속도가 중요한 경우가 일반적입니다. 두 경우 모두 가능한 많은 정보를 몇 바이트로 묶으려고합니다.

10 년 정도의 Windows 프로그래밍이 아닌 5 년 정도의 PHP (아마도 저만)에 비트 연산자를 사용하는 것을 기억하지 못하지만 일부 하위 수준의 Windows 항목은 비트를 포장합니다.

당신은 "내가 이것을 볼 때 어리석은 느낌을 줄 수는 없다"고 말합니다. 화 내지 마십시오.

카우보이 프로그래머의 출력을 만났습니다.

유지 보수 가능한 코드를 작성하는 것에 대해 아는 것이 있습니까? 나는 그가 1 년 안에 이것으로 돌아와 그 의미를 기억하고 기억해야 할 사람이되기를 진심으로 바랍니다.

의견을 자르거나 아무것도 없는지 모르겠지만이 코드는 QA 관리자였던 곳에서 코드 검토를 통과하지 못합니다 (몇 번이나 보냈습니다).

다음은 좋은 경험 법칙입니다. 코드에서 허용되는 "나이키 정수"는 0 1 1입니다. 다른 모든 숫자는 언어에 따라 #define, cost, enums 등이어야합니다.

3과 0x33333333이 NUM_WIDGET_SHIFT_BITS 및 WIDGET_READ_MASK와 같은 것을 말하면 코드를 쉽게 읽을 수 있습니다.

오픈 소스 프로젝트에 이것을 넣은 사람을 부끄럽게 생각하지만 개인 코드 주석을 잘 작성하고 의미있는 정의 / 열거를 사용하고 자신의 코딩 표준을 갖습니다.


16 진수 상수도 허용 가능하다고 생각합니다. 0xFF00보다 나에게 훨씬 더 읽기 쉽다 0b1111111100000000. 설정된 비트 수를 결정하기 위해 계산하지 않아도됩니다.
Kevin Vermeer

1

이 특정 코드는 그림 5.2 의 Hacker 's Delight 책에서 바로 가져온 것입니다 . C (팝업 기능)에서 온라인 여기 . 저자는 이제 업데이트 된 버전을 사용하도록 권장합니다. http://www.hackersdelight.org/HDcode/newCode/pop_arrayHS.c.txt

이런 종류의 미세 최적화를 배우고 싶다면 그 책을 권합니다. 그것의 재미, 그러나 당신이 매우 낮은 수준의 비트 프로그래밍을 자주하지 않는다면 아마 그것을 이해하지 못할 것입니다; 대부분의 경우 컴파일러는 이러한 많은 종류의 최적화를 수행 할 수 있습니다.

또한 모든 16 진 숫자를 2 진으로 다시 작성하여 이러한 종류의 알고리즘을 이해하고 테스트 사례 또는 2 개에서이를 해결하는 데 도움이됩니다.


1

예를 들어 설명하십시오. 데이터는 일련의 비트입니다. 다음 작업을 수행 할 수있는 바이트 01001101의 비트 수를 계산합니다. 1. 마지막 비트의 값을 확인할 수 있습니다. 2. 시퀀스를 이동할 수 있습니다.

  1. 01001101-> 마지막 바이트는 1이며 총계는 1입니다. 교대
  2. 10100110-> 마지막 바이트는 0이며 총계는 1입니다. 교대
  3. 01010011-> 마지막 바이트는 1, 총 = 2입니다. 교대
  4. 10101001-> 마지막 바이트는 1, 총 = 3입니다. 교대
  5. 11010100-> 마지막 바이트는 0, 총 = 3입니다. 교대
  6. 01101010-> 마지막 바이트는 0, 총 = 3입니다. 교대
  7. 00110101-> 마지막 바이트는 1, 총 = 4입니다. 교대
  8. 10011010-> 마지막 바이트는 0, 총계 = 4입니다. 교대

우리의 대답 : 4.

힘들지 않나요? 비트 단위 연산의 큰 문제는 우리가 할 수있는 일이 제한되어 있다는 것입니다. 우리는 조금 직접 접근 할 수 없습니다. 그러나 예를 들어 마지막 비트의 값을 MASK 00000001과 비교하여 모든 비트를 시프트 연산으로 마지막 비트로 만들 수 있습니다. 물론, 결과 알고리즘은 익숙하지 않은 알고리즘에는 무섭게 보일 것입니다. 지능과 관련이 없습니다.


0

나는 당신이하고있는 일이 다음과 관련이 없다면 그것을 필요로한다고 말하지 않을 것입니다 :

  • 오디오 처리
  • 비디오 처리
  • 제도법
  • 네트워킹 (특히 ​​패킷 크기가 중요한 경우)
  • 엄청난 양의 데이터

유닉스 스타일 플래그로 권한을 저장하는 것은 시스템에 특히 복잡한 권한 모델이 있거나 가독성을 희생하여 모든 것을 단일 바이트로 크 래핑하려는 경우 또 다른 용도입니다.

이러한 영역을 제외하고 개발자 / 고급 개발자가 비트 이동을 시연하고 | &와 ^는 당신이 말할 수있는 직업에 대한 관심을 보여 주므로보다 안정적이고 신뢰할 수있는 코드로 이어집니다.

언급 된 것처럼 첫눈에 방법을 '얻지'않는 한, 수행중인 작업과 배경에 대한 설명이 필요합니다. 나는 그것이 지능과 관련이 있다고 말하지는 않지만 매일 16 진수로 작업하고 특정 패턴으로 해결할 수있는 문제를 인식하는 데 얼마나 익숙한 지 알고 싶습니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.