[해결]% 연산을 &연산으로 변환할 수 있나요 ?

dingkyu의 이미지

우연히 본 코드인데 이거 아무리 생각해 봐도
% 연산자를 달리 활용한건데 왜 이렇게 한건지 도저히 모르겠네요.

코드는,

(((int)변수 - 1) & 7)

이고 변수에 어떤 수가 들어가든 위의 결과는 결국

(int)변수 % 8

이라고 스스로는 결론내렸습니다.

그런데 이렇게 해야 할 이유가 따로 있나요 ?
왜 이렇게해야 하는지 혹시 아시는분은 가르쳐주시기 부탁드립니다.

haze11의 이미지

똑같을 때 %보다 &이 빠르지 않나요?

dingkyu의 이미지

구조적으로 % 연산이 어떤 과정을 거치는지 잘은 모르겠지만
단순히 생각해 보면

한번 뺀 다음에 다시 & 연산을 하니까
한번 % 연산한것 보다는 아주 조금이라도 느리지 않나요 ?

단순히 속도적인 면 이외에 다른 뭔가는 없는가 ? 해서 여쭤봅니다.

고민이 많아 고민인 애늙은이 입니다.

체스맨의 이미지

속도입니다. 뺄셈과 & 를 감수할만큼 % 가 느립니다. 클럭수 합산을 해보면 아마 맞을 겁니다.

경우에따라 컴파일러가 똑똑하면 이런 최적화를 내부적으로 수행할 수도 있습니다만, 속도문제가 중요한 루프 안에서는 좋지 않은 컴파일러까지 대비해서 속도 위주로 가는 게 일반적이죠...

Orion Project : http://orionids.org

plusme의 이미지

Computer arithmetic 책을 보시면 알겠지만,

*일반적인 구현에서* %는 +,-,& 등 에 비해 수십배 느립니다.

jick의 이미지

수십 배면 양반이고 시스템에 따라 수백 배 느릴 수도 있습니다. 옛날에 회사 다닐 때 속도를 시스템 별로 조사한 적이 있었는데 지금은 다 까먹었지만 -.- 시스템 중에 아예 정수 나눗셈을 하드웨어에서 지원하지 않는 경우도 있더군요. 이런 데서 % 쓰면 우리가 국민학교에서 배우는 나눗셈 알고리듬을 기계어로 짜서 돌린다는 얘기죠.

그런데 이걸 제대로 테스트해 보려면, 원래 코드처럼 % 8 해버리면 웬만한 컴파일러는 다 비트 연산으로 최적화를 해버리니까 임의의 숫자를 받아서 %를 돌려주는 함수를 만들고 다른 데서 불러보면서 테스트해 보시면 됩니다. 차이가 확연할 겁니다.

dingkyu의 이미지

오늘도 하나 배워가네요.

답변달아주신 분들 고맙습니다. ^^

고민이 많아 고민인 애늙은이 입니다.

bushi의 이미지

signed 의 &7 와 %8 은 틀립니다.
마찬가지로 *2 와 <<1 도 틀리고, /2 와 >>1 도 틀립니다.

OTL

comni의 이미지

2의 승수로의 나누기 관련해서는
A / 2^n ==> A >> n ( 오른쪽으로 n번 shift)
A % 2^n ==> A & (2^n-1), (여기서 2^n-1은 2진수로 1이 n개인 수가 되겠지요~)
로 하는 것이 빠른 듯 합니다~

그런데

Quote:

(int)변수 % 8

이라고 스스로는 결론내렸습니다.


여기도 위와 마찬가지로 변수가 아니라 (변수-1) 아닌가요?

댓글 달기

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