1byt을 하위4bit와 상위 4bit로 나눠서 데이터를 담는법 문의

siba555의 이미지

안녕하세요.
1byt(8bit)에 각각 상하위 4bit에 숫자 0(0000)에서 9(1001)까지를 담아 필요시에 다시 bit에 상하위 4비트씩에 셋팅한 숫자값을 구하려고 하는데요..
비트연산이 서툴러서 잘모르겠네요.. 방법좀 알려주시면 감사하겠습니다. ^^;;;

mirheekl의 이미지

비슷한 예제가 여기 나와있습니다. 다만 니블을 사용한 것은 32비트용이고, 1바이트 예제에는 정작 니블이 없으니 절충해서 만드시면 될 듯.

http://stackoverflow.com/questions/20005349/define-union-that-can-access-bits-nibbles-bytes

--

siba555의 이미지

즐거운 하루되세요.

익명 사용자의 이미지

저는 union보다는 unsigned 타입에 대해 비트연산 쓰는걸 추천합니다.
union의 동작은 까다로운 면이 많습니다.
위 링크에서도 이식성 문제를 경고하고 있죠.

That may work but I think there's no guarantee that bit1 will be the lsb. The compiler can start assigning bits from msb to lsb. So I don't think it's portable. – agbinfo Nov 15 '13 at 16:27

any time you start using bitfields you have left the world of portability, but based on what the OP asked this is what they are looking for, – tletnes Nov 15 '13 at 17:52

CPU는 사실상 1bit나 1byte 단위로 메모리에 접근을 못하기 때문에
속도도 비트연산 쪽이 빠르거나 비슷합니다.

함수 이름은 취향에 맞게 적당히 고치세요.
만약 매크로 함수로 고칠 거라면 (unsigned char)라는 형변환 연산자를 적당히 붙여줘야 합니다.

 
#include <stdio.h>
 
inline unsigned char combine1byte(unsigned char most, unsigned char least)
{
    return ((unsigned char)0xF0 & (most << 4)) | ((unsigned char)0x0F & (least));
}
 
inline unsigned char getMost4bit(unsigned char uc)
{
    return ((unsigned char)0xF0 & uc) >> 4;    
}
 
inline unsigned char getLeast4bit(unsigned char uc)
{
    return ((unsigned char)0x0F & uc);
}
 
int main(void)
{
	unsigned char c = 0xAC;    // 경고: 비트연산 할때는 signed 타입은 쓰지 마세요.
	printf("%x\n", getMost4bit(c));
	printf("%x\n", getLeast4bit(c));
	c = combine1byte(0x0B, 0x0D);
	printf("%x\n", c);
 
	return 0;
}
siba555의 이미지

즐거운 하루되세요.

댓글 달기

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