Bitwise Operator and Logical Operator

・Bitwise AND Operator & と Logical AND Operator &&

C/C++の論理演算(logical operation)では、0は偽(false)、0以外は真(true)です!

and.c

#include <math.h>
#include <stdio.h>

int main(void) {
  printf("%d\n", 0&1);
  printf("%d\n", 2&3);
  printf("%d\n", 0&&1);
  printf("%d\n", 2&&3);
  printf("%d\n", 'a'&&"abc");

  int i = 3;
  int n = 7;
  if ((int)pow(2, i - 1) & n) {
    printf("The %d-th bit in the binary representation of the decimal number %d is 1!\n", i, n);
  }
  else {
    printf("The %d-th bit in the binary representation of the decimal number %d is 0!\n", i, n);
  }
}

〈実行結果〉

0
2
0
1
1
The 3-th bit in the binary representation of the decimal number 7 is 1!


参考サイト

1.Google:Bitwise Operator and Logical Operator
2.2進数、8進数、10進数、16進数相互変換ツール

広告

C/C++における条件コンパイル

条件コンパイル(conditional compilation)のやり方です。日本語では、コンパイラスウィッチとかコンパイルスウィッチと呼ばれることがあります。

conditional_compilation1.c

#include <stdio.h>
#define DEBUG 1

int main(void) {
#if DEBUG
  printf("Debug Mode!\n");
#endif
}

conditional_compilation2.c

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
  printf("Debug Mode!\n");
#endif
}


参考サイト

1.#ifディレクティブを使った条件コンパイル
2.#ifdefディレクティブを使った条件コンパイル

FLTK による GUI アプリケーションの開発(Windows)

FLTK は軽量クロスプラットフォームのGUIライブラリです。ライブラリが静的にリンクされるので FLTK がインストールされていない Windows PC でも実行できます。その上、生成される実行ファイルのサイズが小さいので容易に配布できます。また、プログラムを比較的簡単に作成できるのもメリットの一つです。
ということで、私はとても気に入っています!
以下では、Windows環境での FLTK による GUI アプリケーションの作成手順について説明します。


1.MinGW と MSYS のインストール

FLTK をビルドするために、MinGW をDドライブの直下にインストールします。インストールの際に MinGW Installation Manager で mingw32-gcc-g++msys-base を指定すると MSYS も一緒にインストールできます。MinGW のインストールについては、“clang++ による DLL のビルド” の記事の MinGW の箇所を参考にして下さい。
インストールが終わったら、D:\MinGW\msys\1.0\msys.bat をダブルクリックして MSYS を起動し、下記のコマンドを実行するとパスを設定できます。
注)exit で一旦終了して MSYS を再起動した後にパスが有効になるので、exit するのを忘れないで下さい。

<MSYS>

$ echo "PATH=\$PATH:/D/MinGW/bin" > .profile
$ exit


2.FLTK のビルドとインストール

まず、FLTK のソールファイル fltk-1.3.3-source.tar.gz をダウンロードし、
“D:\MinGW\msys\1.0\home\ユーザ名”の直下に置きます。
続いて、D:\MinGW\msys\1.0\msys.bat をダブルクリックして MSYS を起動し、ソースファイルのあるディレクトリで以下のコマンドを実行すれば、解凍 → ビルド → インストール が行えます。

<MSYS>

$ tar -xvf fltk-1.3.3-source.tar.gz
$ cd fltk-1.3.3
$ ./configure
$ make
$ make install


3.C++によるプログラムの作成

以下は、FLTK を使ったサンプルプログラムです。

click.cpp

#include <FL/Fl.H>
#include <FL/Fl_Button.H>
#include <FL/Fl_Input.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Window.H>

class Window : Fl_Window {
  Fl_Button* fl_button;
  Fl_Input* fl_input;
  Fl_Output* fl_output;
public:
  Window(int, int, const char*);
  ~Window();
private:
  static auto copy(Fl_Widget*, void*) -> void;
};

Window::Window(int width, int height, const char* title) : Fl_Window(width, height, title) {
  begin();
  fl_button = new Fl_Button(0, 0, 50, 25, "copy");
  fl_input = new Fl_Input(50, 50, 350, 25, "input:");
  fl_output = new Fl_Output(50, 100, 350, 25, "output:");
  end();
  fl_button->callback(copy, this);
  show();
}

Window::~Window() {
  if (fl_button != NULL) delete fl_button;
  if (fl_input != NULL) delete fl_input;
  if (fl_output != NULL) delete fl_output;
}

auto Window::copy(Fl_Widget* wt, void* vd) -> void {
  ((Window*)vd)->fl_output->value(((Window*)vd)->fl_input->value());
}

auto main() -> int {
  Window window(500, 250, "^o^");
  return Fl::run();
}

ファイルをペースト(ドラッグ・アンド・ドロップ)すると、ファイルのパスが表示されます。

paste.cpp

#include <sstream>
#include <vector>
#include <FL/Fl.H>
#include <FL/Fl_Box.H>
#include <FL/Fl_Output.H>
#include <FL/Fl_Window.H>

auto split(const std::string& input, char delimiter = ',') -> std::vector<std::string> {
  std::stringstream stringstream(input);
  std::string token;
  std::vector<std::string> output;
  while (std::getline(stringstream, token, delimiter)) {
    output.push_back(token);
  }
  return output;
}

class Box : Fl_Box {
  Fl_Output* fl_output;
public:
  Box(int, int, int, int, Fl_Output*);
private:
  auto handle(int) -> int;
};

Box::Box(int x, int y, int width, int height, Fl_Output* fl_output) : Fl_Box(FL_UP_BOX, x, y, width, height, "") {
  this->fl_output = fl_output;
  label("Paste here!");
  labelcolor(FL_BLUE);
  labelfont(FL_ITALIC);
  labelsize(25);
}

auto Box::handle(int event) -> int {
  switch (event) {
    case FL_DND_DRAG:
    case FL_DND_ENTER:
    case FL_DND_LEAVE:
    case FL_DND_RELEASE:
    return 1;

    case FL_PASTE:
    fl_output->value(split(Fl::event_text(), '\n')[0].c_str());
    label("Completed!");
    labelcolor(FL_RED);
    return 1;

    default:
    return Fl_Box::handle(event);
  }
}

class Window : Fl_Window {
  Fl_Output* fl_output;
  Box* box;
public:
  Window(int, int, const char*);
  ~Window();
};

Window::Window(int width, int height, const char* title) : Fl_Window(width, height, title) {
  begin();
  fl_output = new Fl_Output(50, 25, 450, 25, "output:");
  box = new Box(0, 50, 500, 200, fl_output);
  end();
  show();
}

Window::~Window() {
  if (fl_output != NULL) delete fl_output;
  if (box != NULL) delete box;
}

auto main() -> int {
  Window window(500, 250, "^o^");
  return Fl::run();
}


4.プログラムのビルド

MSYSで以下のコマンドを実行するとプログラムをビルドできます。
注)-static を外すと、実行する際に libstdc++-6.dll と libgcc_s_dw2-1.dll が必要になります。

<MSYS>

$ g++ -std=c++11 -static `fltk-config --cxxflags` *.cpp `fltk-config --ldflags` -o fltk.exe
$ strip fltk.exe


参考サイト