비트 연산에 관해서..

leolo의 이미지

제가 현재 비트연산에 관해서 연구중입니다.
예를 들어서
뉴스 = 0x02
스포츠 = 0x03
야구 = 0x04
두산 = 0x05
이렇게 설정된 한바이트 카테고리를 조합해서
4바이트의 정수형을 만들고자 합니다.
sum = 0x02030405

그리고, 맨 앞의 바이트를 읽어서 첫번째 카테고리가 "뉴스"인지를
확인하고자 합니다.

이를 위한 define문을 좀 알려주세요.
uint8_t new = 0x02
uint8_t sp = 0x03
uint8_t bs = 0x04
uint8_t ds = 0x05

uint32_t sum = 0x02030405

한가지 질문 더 드립니다.
0x00040000 의 사이즈로 표기된것 몇 KB인가요?
32KB가 아닌가요..

RedPain의 이미지

#define NEWS 0x02

if ( ( sum & ( NEWS << 24 ) ) == ( NEWS << 24 ) )

또는

#define NEWS 0x02000000

if ( ( sum & NEWS ) == NEWS )

xyhan의 이미지

비트 연산이라면..
1 -----1
01 -----2
001 -----4
0001 ----8

로 해서 and 연산을 해서 값을 빼오는게
쉬울꺼 같습니다.

뉴스 = 0x01
스포츠 = 0x02
야구 = 0x04
두산 = 0x08

_-_ 질문이 .. 약간 &&&이는 군요..

============================================================

선한 인간이냐 악한 인간이냐는 그사람의 의지에 달렸다. -에픽테토스-
의지 노력 기다림은 성공의 주춧돌이다. -파스퇴르-

============================================================

Together의 이미지

비트 연산을 하실려면 제곱승을 하셔야 합니다.

1, 2, 4, 8, 16, ... 이런식으로요.

int news = 0x01;
int sport = 0x02;
int bball = 0x04;
int dusan= 0x08;

int all = news | sport | bball | dusan;// 4가지 비트가 모두 set 됫슴다.

if (all | news == all)
{
//news 비타가 set 되있슴.
}
else
{
//news 비트가 set 되지 않았슴.
}

all = all | news;// news 비트가 set 됨.

all = (all | news)^news;// news 비트가 unset 됨.

sport, bball 등도 마찮가니다.
news 자리에 sport나 bball을 놓고 연산하면
세트되었는지 테스트 할수 있으며
set 하거나 unset 할수 있습니다.

내가 문제를 제대로 이해 했는지 모르겠는데
아마 맞을듯 합니다.

즐거운 하루 되세요 ^^

- 험한 세계에서 자주국방 없는 경제력은 경비없는 은행이다. -

신동익의 이미지

union 과 struct 를 이용해서 만들어 봤습니다.
8비트니까 char배열 썻죠.

//  
//		shin dong ik  - 2003. 7 
//		: TEST 
//
//////////////////////////////

#include  <stdio.h>

#define  DEF_LAN   4 

enum{  NEWS = 0x02 , SP ,BS ,DS } ; 

struct {
   char	str[10]	; 
   char	va	;
}DEF[DEF_LAN] = {
   {"뉴스"		,	NEWS},
   {"스포츠"	,	SP},
   {"야구"		,	BS},
   {"두산"		,	DS}
};

union BitData
{
   int	value;
   struct	
   {
       char v[4];
   }b_value; 
}; 

void main ()
{	
   union BitData A ; 

   // 쓰기

   A.b_value.v[3] = NEWS ; 
   A.b_value.v[2] = SP ;
   A.b_value.v[1] = BS ;
   A.b_value.v[0] = DS ;

   printf("%.8x\n",  A.value );

   // 읽기

   for(int i =0 ; i < 4 ; i++)
   {
        printf("%d번째값은 0x%.2x " , i+1 , A.b_value.v[i]  );

        for(int j =0 ; j < DEF_LAN ; j++)
            {	
                 if ( A.b_value.v[i] == DEF[j].va )
                 {
                 printf("  : <%s> 입니다. \n" , DEF[j].str );
                 }
            }
   }
}

2:^)

mtorange의 이미지

비트필트를 써보시죠.. 비트필드를 사용하면 비트연산은 컴파일러가 알아서 해줍니다..


union {
  struct {
     int news : 1;
     int sports : 1;
     int baseball : 1;
  } bits;
 unsigned int ival;
} x;

x.ival = 0x30929310; // 32 bit unsigned integer값 할당
if (x.bits.news) puts("news  bit가 설정되었습니다.");
if (x.bits.sports) puts("sports bit가 설정되었습니다.");

x.bits.baseball = 0; // baseball bit를 끔.


garuna의 이미지

16 x 4 = 64

댓글 달기

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
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.