2013年11月19日火曜日

開発環境

C実践プログラミング 第3版 (Steve Oualline (著)、 望月 康司 (監訳) (翻訳)、谷口 功 (翻訳)、オライリー・ジャパン)のⅡ部(単純なプログラミング)の11章(ビット演算)、11.8(ビットマップグラフィックス)、11.10(プログラミング実習)、実習11-6をDartで解いてみる。

その他参考書籍

実習11-6.

コード

sample.dart

import 'dart:html';
import 'package:fixnum/fixnum.dart' as fixnum;

void main(){
  Element pre = querySelector('#pre0');
  InputElement input = querySelector('#t0');
  RegExp pattern = new RegExp(r'^[-]?\d+$');
  String result = window.navigator.userAgent + '\n';
  result += '全てのビットを左端までシフト\n';
  result += 'その他の数値\n';
  [170, 0, 1, 2, 3, 4, 5, -1, -2].forEach((int n){
    fixnum.Int32 a = new fixnum.Int32(n);
    result += '$a: ${allLeft(a)}\n';
  });
  result += '入力値\n';
  pre.text = result;
  input.onKeyUp.listen((KeyboardEvent event){
    String temp = '';
    String v = input.value;
    if (!pattern.hasMatch(v)){
      temp += '整数(32ビット符号付き、10進数)を入力して下さい。\n';
    } else {
      fixnum.Int32 n = new fixnum.Int32(int.parse(v));
      temp += '$n: ${allLeft(n)}';
    }
    pre.text = '$result$temp';
  });
}

fixnum.Int32 allLeft(fixnum.Int32 n){
  int bits = 0;
  fixnum.Int32 m = new fixnum.Int32(1);
  fixnum.Int32 l = new fixnum.Int32(1);
  while (m != (l << 31)){
    if (n & m != 0){
      bits += 1;
    }
    m <<= 1;
  }
  if (m & n != 0){
    bits += 1;
  }
  if (bits == 0){
    m = new fixnum.Int32(0);
  }
  bits -= 1;
  while (bits > 0){
    m >>= 1;
    bits -= 1;
  }
  return m;
}














						

0 コメント:

コメントを投稿