1로 셋팅된 비트의 갯수 구하는 방법좀..

hanna의 이미지

1바이트의 데이터가 있을때(char) 여기에서 각각의 비트값 중에서 1비트의 갯수를 구하는 간단한 방법이 없을까요?

barmi의 이미지

WORD GetNumberOfBits( DWORD dwMask )
{
    WORD wBits = 0;
    while( dwMask )
    {
        dwMask = dwMask & ( dwMask - 1 ); 
        wBits++;
    }
    return wBits;
}

MSDN에서 본겁니다. 자주 애용하고 있는 코드기도 하구요.

아, 그리고,

hanna wrote:
1바이트의 데이터가 있을때(char) 여기에서 각각의 비트값 중에서 1비트의 갯수를 구하는 간단한 방법이 없을까요?

여기서 갯수는 개수로 써야 합니다.
HDNua의 이미지

댓글 남겨서 기억해놓으렵니다.

저는 이렇게 생각했습니다.

최종호의 이미지

비트연산 공부하시는 것 아니라면 표로 만드세요..

bits_in_byte[256] = {0, 1, 1, 2, ...., 8};
#define NBITS(x) bits_in_byte[(unsigned char)(x)]

이와 비슷한 스레드가 byte 의 bit들을 뒤집는 것이 있었는데,
한번 검색해 보세요.

Hyun의 이미지

barmi wrote:
아, 그리고,
hanna wrote:
1바이트의 데이터가 있을때(char) 여기에서 각각의 비트값 중에서 1비트의 갯수를 구하는 간단한 방법이 없을까요?

여기서 갯수는 개수로 써야 합니다.

갯수는 어떨 때 쓰죠? 잘못된 말인가요?
doldori의 이미지

C++입니다. :)

#include <bitset>
#include <limits>

void f()
{
    std::bitset<std::numeric_limits<unsigned char>::digits> c;
    size_t n = c.count();
}
fox9의 이미지

박현우 wrote:
barmi wrote:
아, 그리고,
hanna wrote:
1바이트의 데이터가 있을때(char) 여기에서 각각의 비트값 중에서 1비트의 갯수를 구하는 간단한 방법이 없을까요?

여기서 갯수는 개수로 써야 합니다.

갯수는 어떨 때 쓰죠? 잘못된 말인가요?

인터넷으로 검색해보니 개수도 한자어인데 두음절로 된 한자어의 경우 아래 여섯 단어를 제외하고는 모두 사이시옷이 안들어간다는군요

곳간(庫間), 셋방(貰房), 숫자(數字), 찻간(車間), 툇간(退間), 횟수(回數)

그래서 갯수 -> 개수 :)

cdpark의 이미지

소수(prime)에게도 사이시옷을 허하라! (생뚱맞게)

코퍼스의 이미지

int getNumBits(unsigned char in)
{
     int i, count;

    for(i=0, count=0; i<8 ; i++)
    {
        if(in & (ox01 <<i)) count++;
     }

    return count;
}
 

물론 테스트는 안한 코드입니다.ㅠ_ㅠ;

A few Good Man

litdream의 이미지

브라이언 커니건의 비트 카운트 입니다.
처음 봤을때 많이 신기해서 저장해놨었네요..

    int bitcnt(int n)
    {
        int c, v=n;
        for (c = 0; v; c++)
        {
          v &= v - 1; // clear the least significant bit set
        }
        return c;
    }

삽질의 대마왕...

barmi의 이미지

barmi wrote:
WORD GetNumberOfBits( DWORD dwMask )
{
    WORD wBits = 0;
    while( dwMask )
    {
        dwMask = dwMask & ( dwMask - 1 ); 
        wBits++;
    }
    return wBits;
}

MSDN에서 본겁니다. 자주 애용하고 있는 코드기도 하구요.

litdream wrote:
브라이언 커니건의 비트 카운트 입니다.
처음 봤을때 많이 신기해서 저장해놨었네요..
    int bitcnt(int n)
    {
        int c, v=n;
        for (c = 0; v; c++)
        {
          v &= v - 1; // clear the least significant bit set
        }
        return c;
    }

같은 겁니다... :)

kihlle의 이미지

속도를 요구하는 트릭이라면 1차원배열[256]을 써도 됩니다. array[x]="x의true비트수" 가 되는 배열 array를 만들면 되지요.

그런데... 이경우는 로직자체가 간단해서 속도의 잇점이 없겠군요. :cry:

homeless

atie의 이미지

/**
 * Counts number of 1 bits in a 32 bit unsigned number.
 *
 * @param x unsigned 32 bit number whose bits you wish to count.
 *
 * @return number of 1 bits in x.
 * @author Roedy Green email
 */
public static int countBits(int x ) {
   // collapsing partial parallel sums method
   // collapse 32x1 bit counts to 16x2 bit counts, mask 01010101
   x = (x >>> 1 & 0x55555555) + (x & 0x55555555);
   // collapse 16x2 bit counts to 8x4 bit counts, mask 00110011
   x = (x >>> 2 & 0x33333333) + (x & 0x33333333);
   // collapse 8x4 bit counts to 4x8 bit counts, mask 00001111
   x = (x >>> 4 & 0x0f0f0f0f) + (x & 0x0f0f0f0f);
   // collapse 4x8 bit counts to 2x16 bit counts
   x = (x >>> 8 & 0x00ff00ff) + (x & 0x00ff00ff);
   // collapse 2x16 bit counts to 1x32 bit count
   return(x >>> 16) + (x & 0x0000ffff);
}
   

루프 돌리는 것보다 5배 빠르다는데 비교해 보실분?

----
I paint objects as I think them, not as I see them.
atie's minipage

익명 사용자의 이미지

헐.. 이해하는데 한 5분걸렸습니다... 정말 생각도 못한 방법이네요... 정만 똑똑한 사람들 많습니다...

익명 사용자의 이미지

알고리즘 적인 것이라면 이미 나온 것이고,
비트 수 구하는 것은 CPU 명령으로도 있습니다.

Visual C++ 이라면 __popcnt16, __popcnt, __popcnt64 등을 => https://msdn.microsoft.com/ko-kr/library/bb385231.aspx
GCC같은 GNU계열이라면 __builtin_popcount() 를 이용하시면 됩니다. => https://gcc.gnu.org/onlinedocs/gcc/Other-Builtins.html

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

BBCode

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param>
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.

Textile

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • You can use Textile markup to format text.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Markdown

  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • Quick Tips:
    • Two or more spaces at a line's end = Line break
    • Double returns = Paragraph
    • *Single asterisks* or _single underscores_ = Emphasis
    • **Double** or __double__ = Strong
    • This is [a link](http://the.link.example.com "The optional title text")
    For complete details on the Markdown syntax, see the Markdown documentation and Markdown Extra documentation for tables, footnotes, and more.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>

Plain text

  • HTML 태그를 사용할 수 없습니다.
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
  • 줄과 단락은 자동으로 분리됩니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.