メインコンテンツまでスキップ

「Mathematics」タグの記事が3件件あります

全てのタグを見る

Python: 10進数整数を2進数文字列に変換する関数

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

2進数文字列を10進数整数に変換する関数int()はありますが、

>>> int('1011', 2)
11

その逆の、10進数整数を2進数文字列に変換する関数が(Python2.5では)見当たらなかったので、書いてみました。

ソースコード

#!/usr/bin/python
# coding: UTF-8
import math, string
# 10進数整数を2進数文字列に変換する関数
# decimal : 10進数整数
# press : 上位桁の0を切り詰めるフラグ
def toBinary(decimal, press=True):
if decimal == 0: return '0'
bin_str = ""
i = 31
while i >= 0:
bi = int((decimal & int(math.pow(2, i))) >> i)
bin_str += str(bi)
i -= 1
if press:
try:
bin_str = bin_str[bin_str.index('1'):]
except ValueError:
print 'error'
bin_str = '0'
return bin_str
bin_arr = [toBinary(i) for i in range(21)]
print '10進数t2進数'
for i in range(len(bin_arr)):
print '%2dt%5s' % (i, bin_arr[i])

Pythonでは明示的に型変換する必要がありますので、所々int()、str()を用いて型直ししています。

実行結果

10進数 2進数
0 0
1 1
2 10
3 11
4 100
5 101
6 110
7 111
8 1000
9 1001
10 1010
11 1011
12 1100
13 1101
14 1110
15 1111
16 10000
17 10001
18 10010
19 10011
20 10100

追記: 32bit以上の整数を扱う場合

参考: 10進数を2進数と16進数に変換する - gan2 の Ruby 勉強日記 ↑の記事で、データサイズにかかわらず処理できるRubyプログラムがありましたので、参考させていただきました。

def toBinary2(decimal):
if decimal == 0: return '0'
bin_str = ""
while decimal > 0:
bin_str += str(decimal % 2)
decimal >>= 1
return bin_str[::-1]

実行結果は上と同じです。

リファレンス

10進数を2進数に変換表示するC言語プログラム

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

ソースコード

// filename: dtob.c
// convert decimal to binary
#include <stdio.h>
const int BitSize = sizeof(int) * 8; // 整数型のビットサイズを算出
void dtob(int x) {
int bit = 1, i;
char c[BitSize];
for (i = 0; i < BitSize; i++) {
if (x & bit)
c[i] = '1';
else
c[i] = '0';
bit <<= 1;
}
// 計算結果の表示
printf("2進数: ");
for ( i = BitSize - 1; i >= 0; i-- ) {
putchar(c[i]);
}
printf("\n");
}
int main()
{
int x = 0;
do {
printf("10進数を2進数に変換します(0で終了)\n");
printf("xの値: ");
scanf("%d", &x);
dtob(x);
} while (x != 0);
return 0;
}

実行結果

$ gcc dtob.c
$ ./a.out
10進数を2進数に変換します(0で終了)
xの値: 5
2進数: 00000000000000000000000000000101
10進数を2進数に変換します(0で終了)
xの値: 8
2進数: 00000000000000000000000000001000
10進数を2進数に変換します(0で終了)
xの値: 100
2進数: 00000000000000000000000001100100
10進数を2進数に変換します(0で終了)
xの値: 256
2進数: 00000000000000000000000100000000
10進数を2進数に変換します(0で終了)
xの値: 1984949894
2進数: 01110110010011111110111010000110
10進数を2進数に変換します(0で終了)
xの値: 0
2進数: 00000000000000000000000000000000
$

ビットが0か1の判断するループ順序を逆にして、配列末尾に'\0'を代入すれば、計算結果の表示は配列の文字列表示ですみます。そうすると「計算結果の表示」の際にforループを使う必要はないなぁ、と書き終わった今思いました(ぇー)。

作成の経緯

以前、拡張ハッシュ法の削除関数を実装している際に、キーをバケットに振り分ける際のアドレス算出の処理部分にデバッグプリントが欲しくて作ったものです。

二桁の掛け算を素早く暗算する方法

· 約2分
Yu Sasaki
Enterprise Security Manager / Advisor

最近使い始めた、同じ二桁(1の位の和が10であるもの)の数の掛け算を素早く暗算する方法を紹介します。

例:75×75を暗算する

頭の中で、

7×(7+1)×100+5×5=5625

のように計算します。
これは、まず始めに十の位の数とその数に1加えた数の積を求めます。
上の例では、7×(7+1)=56ですね。
この積(56)の右に25(=5×5)を書くと
答え、5625となります。

ホントに正しいの?という方は…どうぞ→「75×75=

暗算方法の種明かし

では、何故上のような計算をしたのでしょうか?
それを解くヒントは、掛け算しやすい形に(因数)分解して計算することです。
先ほどの例を使ってみましょう。

75×75
⇔(70+5)(70+5)
⇔70×70+2×70×5+5×5
⇔7×7×100+7×100+25
⇔7(7+1)×100+25 ⇔5600+25
⇔5625

の様になります。 上の式の緑の部分を見ると、何故一の位が5である二桁の数同士にしかこの計算方法が使えないかが分かります。
もし、一の位が5以外の数xとした時2*x≠10にならず、括弧(共通因数)で括れないからです。

普遍性のある暗算法

今回この記事を書くにあたって「計算 暗算 掛け算」などを検索した結果、インド式暗算法(湘南 研究所)というのを知りました。
一言でまとめると、二桁の掛け算を四角形の面積と捉え、それを計算し易い4つの四角形に分割したものの面積の和をとるというものです。

これはかなり良いですね。知り、実践すれば「おー、確かに、頭の中で筆算描くより楽だ」と実感すること請け合いです(^-^)bお試しあれ。(頭の中でそろばんはじいている方にもオススメ)
単純作業を行ううえで、このような思考の簡略化を行えるフレームワークは大事ですね。