質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.02%

intについて

解決済

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 333

miiichat

score 67

Matrix operator*(const Matrix &m) const
{
     Matrix t;

     for (int i = 0; i < 16; ++i)
      }    
        const int j(i & 3), k(i & ~3);
        t.matrix[i] =
        matrix[0 + j] * matrix[k + 0] +
        matrix[4 + j] * matrix[k + 1] +
        matrix[8 + j] * matrix[k + 2] +
        matrix[12+j] * matrix[k + 3];
      }
      return t;
}

const int j(i & 3), k(i & ~3);
の部分の & は何をしてますか?

---追記---
GLFW による OpenGL 入門(130p)
http://marina.sys.wakayama-u.ac.jp/~tokoi/GLFWdraft.pdf

をやってます。実行できます

#pragma once
#include <algorithm>
#include <GL/glew.h>
#include <cmath>

class Matrix
{
      GLfloat matrix[16];

public:

      Matrix() {}

      Matrix(const GLfloat *a)
      {
            std::copy(a, a + 16, matrix);
      }

      const GLfloat *data() const
      {
            return matrix;
      }

      void loadIdentity()
      {
            std::fill(matrix, matrix + 16, 0.0f);
            matrix[0] = matrix[5] = matrix[10] = matrix[15] = 1.0f;
      }

      static Matrix identity()
      {
            Matrix t;
            t.loadIdentity();
            return t;
      }

      static Matrix translate(GLfloat x, GLfloat y, GLfloat z)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[12] = x;
            t.matrix[13] = y;
            t.matrix[14] = z;

            return t;
      }

      static Matrix scale(GLfloat x, GLfloat y, GLfloat z)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[0] = x;
            t.matrix[5] = y;
            t.matrix[10] = z;

            return t;
      }

      static Matrix shearXY(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[4] = angle;

            return t;
      }

      static Matrix shearYZ(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[9] = angle;

            return t;
      }

      static Matrix shearZX(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[2] = angle;

            return t;
      }

      static Matrix shearYX(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[1] = angle;

            return t;
      }

      static Matrix shearZY(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[6] = angle;

            return t;
      }

      static Matrix shearXZ(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[8] = angle;

            return t;
      }

      static Matrix rotationX(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[5] = cos(angle);
            t.matrix[6] = sin(angle);
            t.matrix[9] = -sin(angle);
            t.matrix[10] = cos(angle);

            return t;
      }

      static Matrix rotationY(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[0] = cos(angle);
            t.matrix[2] = sin(angle);
            t.matrix[8] = -sin(angle);
            t.matrix[10] = cos(angle);

            return t;
      }

      static Matrix rotationZ(GLfloat angle)
      {
            Matrix t;
            t.loadIdentity();
            t.matrix[0] = cos(angle);
            t.matrix[1] = sin(angle);
            t.matrix[4] = -sin(angle);
            t.matrix[5] = cos(angle);

            return t;
      }

      static Matrix rotate(GLfloat a, GLfloat x, GLfloat y, GLfloat z)
      {
            Matrix t;
            const GLfloat d(sqrt(x * x + y * y + z * z));

            if (d > 0.0f)
            {
                  const GLfloat l(x / d), m(y / d), n(z / d);
                  const GLfloat l2(l * l), m2(m * m), n2(n * n);
                  const GLfloat lm(l * m), mn(m * n), nl(n * l);
                  const GLfloat c(cos(a)), c1(1.0f - c), s(sin(a));

                  t.loadIdentity();
                  t.matrix[0] = (1.0f - l2) * c + l2;
                  t.matrix[1] = lm * c1 + n * s;
                  t.matrix[2] = nl * c1 - m * s;
                  t.matrix[4] = lm * c1 - n * s;
                  t.matrix[5] = (1.0f - m2) * c + m2;
                  t.matrix[6] = mn * c1 + l * s;
                  t.matrix[8] = nl * c1 + m * s;
                  t.matrix[9] = mn * c1 - l * s;
                  t.matrix[10] = (1.0f - n2) * c + n2;
            }
            return t;
      }

      Matrix operator*(const Matrix &m) const
      {
            Matrix t;

            for (int i = 0; i < 16; ++i)
            {
                  const int j(i & 3), k(i & ~3);

                  t.matrix[i] =
                        matrix[0 + j] * matrix[k + 0] +
                        matrix[4 + j] * matrix[k + 1] +
                        matrix[8 + j] * matrix[k + 2] +
                        matrix[12+j] * matrix[k + 3];
            }
            return t;
      }
};
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • y_waiwai

    2019/02/08 19:00

    このソースはコンパイルできないでしょ。
    きちんとコンパイル、実行できるコードを提示しましょう

    キャンセル

  • cateye

    2019/02/08 19:04

    各演算子の意味は分かりますか?

    キャンセル

回答 1

checkベストアンサー

+2

こんにちは。

const int j(i & 3), k(i & ~3);

は以下と同じ意味です。

const int j = i & 3;
const int k = i & ~3;

このように書けば読み取れるのでは?(元のコードは読みにく過ぎ)

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/02/08 22:37

    &と~はビット演算子で、
    jの値は0→1→2→3→0→1→2→3→...
    ~3は11を反転して00
    であってますか?

    それだとkは0?

    キャンセル

  • 2019/02/08 23:20

    jの値はその通りですね。
    int型が32ビットの処理系の場合、~3は11を反転して11111111 11111111 11111111 11111100となる処理系がほとんどと思います。

    キャンセル

  • 2019/02/08 23:33

    本当に助かりました。
    ありがとうございます!

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 90.02%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る