2進数でマイナスを表す時には、2の補数を使います。
補数は、全部のビットを反転して1を加える。
10進数の10を、2進数で表すと1010になります。
1010
↓↓
0101 反転した状態。これに1加えると。
↓↓
0110 これが2進数で表した-10。
確かめ方は、「1010」「0110」を足し算する。
「0110」が-10なら、足し算の結果は「0」になるはず。
1010
0110
-----
0000 4ビット2進数なので桁上がりの5ビット目は無視されます。
ちなみに、全部を反転させたものを1の補数といい
「1010」と足し算することで最大値を求めることができます。
1010
0101
----
1111 これが4ビット2進数の最大値。
最後に、1バイトは8ビット。
8ビットで扱える数字の範囲は-128〜127まで。
なぜ、+側は127まで。それは0が含まれるから。
16ビットだと-32768〜32757。
32ビットだと-2147483648〜2147483647。
これは一般的なコンピュータの話です。
量子コンピュータは量子ビットで情報を扱うので。
†
地球の末路!?
†
2020年04月18日
2進数の重みを使って2進数を10進数に
4ビット2進数で10進数の10を表すと「1010」。
10進数から2進数にする場合は、割り算を使いましたが
逆の場合は、掛け算を使います。
1ビット目は2の0乗、2ビット目は2の1乗、3ビット目は2の2乗
4ビット目は2の3乗を「1010」に掛けます。0乗は1です。
1ビット目:0 × 2の0乗(1) = 0
2ビット目:1 × 2の1乗(2) = 2
3ビット目:0 × 2の2乗(4) = 0
4ビット目:1 × 2の3乗(8) = 8
この掛け算の答えを足すと10進数の「10」となります。
「0」「1」しかない2進数で「-10」ってどう表す?
それはまた次回に。
† 地球の末路!? †
10進数から2進数にする場合は、割り算を使いましたが
逆の場合は、掛け算を使います。
1ビット目は2の0乗、2ビット目は2の1乗、3ビット目は2の2乗
4ビット目は2の3乗を「1010」に掛けます。0乗は1です。
1ビット目:0 × 2の0乗(1) = 0
2ビット目:1 × 2の1乗(2) = 2
3ビット目:0 × 2の2乗(4) = 0
4ビット目:1 × 2の3乗(8) = 8
この掛け算の答えを足すと10進数の「10」となります。
「0」「1」しかない2進数で「-10」ってどう表す?
それはまた次回に。
† 地球の末路!? †
2020年04月17日
10進数の10を2進数にすると?の答え
10進数の10を4ビット2進数にすると「1010」。
0から順番に「0000」「0001」「0010」・・・と
順番にやっていくものありだけど数字が多くなると大変。
そんな時には、割り算!
10を2で割ります。
10 ÷ 2 = 5 … 余り0
5 ÷ 2 = 2 … 余り1
2 ÷ 2 = 1 … 余り0
1 ÷ 2 = 0 … 余り1
商が0になったら割り算終了。大切なのは余り。
余りを下から上に向かって並べたものが
10進数の10を2進数にしたものになります。
逆に、2進数にしたものを10進数にする時には
2進数の重みというものを使います。それはまた次回に。
† 地球の末路!? †
0から順番に「0000」「0001」「0010」・・・と
順番にやっていくものありだけど数字が多くなると大変。
そんな時には、割り算!
10を2で割ります。
10 ÷ 2 = 5 … 余り0
5 ÷ 2 = 2 … 余り1
2 ÷ 2 = 1 … 余り0
1 ÷ 2 = 0 … 余り1
商が0になったら割り算終了。大切なのは余り。
余りを下から上に向かって並べたものが
10進数の10を2進数にしたものになります。
逆に、2進数にしたものを10進数にする時には
2進数の重みというものを使います。それはまた次回に。
† 地球の末路!? †
2020年04月16日
10進数の10を2進数にすると?
普段、私たちが使っているのは10進数。
0〜9までの数字を使用していて、9になると桁上がりします。
「1、2、3・・・9」となると桁上がりして
十の位が「1」になって、一の位が「0」になって「10」になります。
この10進数の10を4ビット2進数にするとどうなるでしょうか。
2進数(4ビットの場合)は、「0」「1」しかないので
10進数でいう「0」は「0000」、「1」は「0001」
「2」は「0010」、「3」は「0011」、「4」は「0100」という感じで
1になると桁上がりします。
答えは、次回に。
† 地球の末路!? †
0〜9までの数字を使用していて、9になると桁上がりします。
「1、2、3・・・9」となると桁上がりして
十の位が「1」になって、一の位が「0」になって「10」になります。
この10進数の10を4ビット2進数にするとどうなるでしょうか。
2進数(4ビットの場合)は、「0」「1」しかないので
10進数でいう「0」は「0000」、「1」は「0001」
「2」は「0010」、「3」は「0011」、「4」は「0100」という感じで
1になると桁上がりします。
答えは、次回に。
† 地球の末路!? †
2020年01月16日
Java ジェネリックス(ジェネリクス)
ジェネリックス(ジェネリクス)は、<>で囲んだ型名を
クラスやメソッドに付加して定義することで
汎用的なクラスをコンパイルする時に特定の型に対応させるための機能。
通常は使用目的や意味を表すTypeやElementの頭文字T、Eを用います。
難しいことは抜きにして書くことこんな感じになります。
class Demo<T>{
private T value;
//コンストラクタ
Demo(T val){
this.value = val;
}
//値の設定
public void setValue(T val) {
this.value = val;
}
//値の取得
public T getValue() {
return value;
}
}
class Example{
public static void main(String[] args) {
Demo<String> d1 = new Demo<String>("こんにちは");
System.out.println(d1.getValue());
d1.setValue("文字列");
System.out.println(d1.getValue());
Demo<Integer> d2 = new Demo<<nteger>(987654);
System.out.println(d2.getValue());
d2.setValue(123456);
System.out.println(d2.getValue());
}
}
===== 実行結果 =====
こんにちは
文字列
987654
123456
====================
DemoのTは、Demo をインスタンス化する時に指定した型になります。
String型であっても、Integer型であってもキャスト(型変換)が不要で
指定した型の値を設定・取得することができるようになります。
† 地球の末路!? †
クラスやメソッドに付加して定義することで
汎用的なクラスをコンパイルする時に特定の型に対応させるための機能。
通常は使用目的や意味を表すTypeやElementの頭文字T、Eを用います。
難しいことは抜きにして書くことこんな感じになります。
class Demo<T>{
private T value;
//コンストラクタ
Demo(T val){
this.value = val;
}
//値の設定
public void setValue(T val) {
this.value = val;
}
//値の取得
public T getValue() {
return value;
}
}
class Example{
public static void main(String[] args) {
Demo<String> d1 = new Demo<String>("こんにちは");
System.out.println(d1.getValue());
d1.setValue("文字列");
System.out.println(d1.getValue());
Demo<Integer> d2 = new Demo<<nteger>(987654);
System.out.println(d2.getValue());
d2.setValue(123456);
System.out.println(d2.getValue());
}
}
===== 実行結果 =====
こんにちは
文字列
987654
123456
====================
Demo
String型であっても、Integer型であってもキャスト(型変換)が不要で
指定した型の値を設定・取得することができるようになります。
† 地球の末路!? †
2019年12月26日
Java オーバーライド
オーバーライドに似た言葉にオーバーロードというのがありますが
今回は、オーバーロードではなく、オーバーライドです。
オーバーライドとオーバーロードの違いですが
オーバーロードは、同じクラス内でメソッド名が同じで
引数の型、引数の数、引数の並び順がことなるメソッドを複数定義すること。
オーバーライドは、スーパークラス(親)とサブクラス(子)の間で
スーパークラスにあるメソッドをサブクラスで再定義すること。
その際の注意点は
・メソッド名
・戻り値の型
・引数の型
・引数の数
・引数の並び順
これら全てを、完全に一致させる必要があります。
難しいことは省いてオーバーライドを書くとこんな感じです。
class Parent{
public void show() {
System.out.println("親クラスのshowです。");
}
}
class Child extends Parent{
public void show() {
System.out.println("子クラスのshowです。");
}
}
class Demo{
public static void main(String[] args) {
Child c = new Child();
c.show();
}
}
===== 実行結果 =====
子クラスのshowです。
====================
スーパークラス(親)をサブクラス(子)が継承して
メソッドshowを再定義しているのでサブクラス(子)のメソッドshowが呼ばれます。
もし、スーパークラス(親)をサブクラス(子)が継承して
メソッドshowを再定義していない場合には
「c.show()」でスーパークラス(親)のメソッドshowが呼ばれ以下のようになります。
===== 再定義していない場合の実行結果 =====
親クラスのshowです。
==========================================
スーパークラス(親)を継承してオーバーライドすることで
複数のメソッドを定義する必要がなくなり、1つのメソッド名を使用して
各クラスで適切な処理を行わせることができます。
また、抽象クラスやインターフェイスを利用することで
継承または実装したクラスにオーバーライドを強制させることができます。
† 地球の末路!? †
今回は、オーバーロードではなく、オーバーライドです。
オーバーライドとオーバーロードの違いですが
オーバーロードは、同じクラス内でメソッド名が同じで
引数の型、引数の数、引数の並び順がことなるメソッドを複数定義すること。
オーバーライドは、スーパークラス(親)とサブクラス(子)の間で
スーパークラスにあるメソッドをサブクラスで再定義すること。
その際の注意点は
・メソッド名
・戻り値の型
・引数の型
・引数の数
・引数の並び順
これら全てを、完全に一致させる必要があります。
難しいことは省いてオーバーライドを書くとこんな感じです。
class Parent{
public void show() {
System.out.println("親クラスのshowです。");
}
}
class Child extends Parent{
public void show() {
System.out.println("子クラスのshowです。");
}
}
class Demo{
public static void main(String[] args) {
Child c = new Child();
c.show();
}
}
===== 実行結果 =====
子クラスのshowです。
====================
スーパークラス(親)をサブクラス(子)が継承して
メソッドshowを再定義しているのでサブクラス(子)のメソッドshowが呼ばれます。
もし、スーパークラス(親)をサブクラス(子)が継承して
メソッドshowを再定義していない場合には
「c.show()」でスーパークラス(親)のメソッドshowが呼ばれ以下のようになります。
===== 再定義していない場合の実行結果 =====
親クラスのshowです。
==========================================
スーパークラス(親)を継承してオーバーライドすることで
複数のメソッドを定義する必要がなくなり、1つのメソッド名を使用して
各クラスで適切な処理を行わせることができます。
また、抽象クラスやインターフェイスを利用することで
継承または実装したクラスにオーバーライドを強制させることができます。
† 地球の末路!? †
2019年12月18日
Java オーバーロード
オーバーロードと似た言葉にオーバーライドというのがありますが
今回は、オーバーライドではなく、オーバーロードです。
オーバーロードとは
・同じメソッド名のメソッドを複数定義することができる。
・引数の型、数、並び順が異なっている。
・戻り値の型や引数名はオーバーロードに関係ない。
Javaでは、シグニチャまたはシグネチャと呼ばれる
メソッド名と引数をセットにしたものでメソッドを見分けているため
戻り値の型や引数名が異なっていたとしてもオーバーロードできません。
コンパイルエラーになります。
で、そんなことを考慮しながらオーバーロードを書くとこんな感じです。
オーバーロードのメソッド名は「setChange」。
class Sample {
private String name;
private int price;
//コンストラクタ
Sample(String name, int price){
this.name = name;
this.price = price;
}
public void show() {
System.out.println(this.name + "は" + this.price + "円です。");
}
public void setChange(String name, int price) {
this.name = name;
this.price = price;
System.out.println("商品名を" + this.name + "に、" + "価格を" + this.price + "円に変更しました。");
}
public void setChange(int price, String name) {
this.price = price;
this.name = name;
System.out.println("価格を" + this.price + "円に、" + "商品名を" + this.name + "に変更しました。");
}
public void setChange(String name) {
this.name = name;
System.out.println("商品名を" + this.name + "に変更しました。");
}
}
class Example {
public static void main(String[] args) {
Sample s = new Sample("オレンジ", 50);
s.show();
s.setChange("キウイフルーツ", 100);
s.show();
}
}
===== 実行結果 =====
オレンジは50円です。
商品名をキウイフルーツに、価格を100円に変更しました。
キウイフルーツは100円です。
====================
メインメソッド側で「(String, int)」(s.setChange("キウイフルーツ", 100);)で
3つある「setChange」メソッドの一番目のメソッドを呼び出しています。
2番目を呼び出したい時には
呼び出し側で「(int, String)」(s.setChange(100, "キウイフルーツ");)に
3番目を呼び出したい時には
呼び出し側で「(String)」(s.setChange("キウイフルーツ");)にします。
・引数の型、数、並び順が異なっている。
・戻り値の型や引数名はオーバーロードに関係ない
オーバーロードする時に、この2つは必ず守って下さい。
コンパイルエラーになるので。最初の方でも書いたけど・・・
† 地球の末路!? †
今回は、オーバーライドではなく、オーバーロードです。
オーバーロードとは
・同じメソッド名のメソッドを複数定義することができる。
・引数の型、数、並び順が異なっている。
・戻り値の型や引数名はオーバーロードに関係ない。
Javaでは、シグニチャまたはシグネチャと呼ばれる
メソッド名と引数をセットにしたものでメソッドを見分けているため
戻り値の型や引数名が異なっていたとしてもオーバーロードできません。
コンパイルエラーになります。
で、そんなことを考慮しながらオーバーロードを書くとこんな感じです。
オーバーロードのメソッド名は「setChange」。
class Sample {
private String name;
private int price;
//コンストラクタ
Sample(String name, int price){
this.name = name;
this.price = price;
}
public void show() {
System.out.println(this.name + "は" + this.price + "円です。");
}
public void setChange(String name, int price) {
this.name = name;
this.price = price;
System.out.println("商品名を" + this.name + "に、" + "価格を" + this.price + "円に変更しました。");
}
public void setChange(int price, String name) {
this.price = price;
this.name = name;
System.out.println("価格を" + this.price + "円に、" + "商品名を" + this.name + "に変更しました。");
}
public void setChange(String name) {
this.name = name;
System.out.println("商品名を" + this.name + "に変更しました。");
}
}
class Example {
public static void main(String[] args) {
Sample s = new Sample("オレンジ", 50);
s.show();
s.setChange("キウイフルーツ", 100);
s.show();
}
}
===== 実行結果 =====
オレンジは50円です。
商品名をキウイフルーツに、価格を100円に変更しました。
キウイフルーツは100円です。
====================
メインメソッド側で「(String, int)」(s.setChange("キウイフルーツ", 100);)で
3つある「setChange」メソッドの一番目のメソッドを呼び出しています。
2番目を呼び出したい時には
呼び出し側で「(int, String)」(s.setChange(100, "キウイフルーツ");)に
3番目を呼び出したい時には
呼び出し側で「(String)」(s.setChange("キウイフルーツ");)にします。
・引数の型、数、並び順が異なっている。
・戻り値の型や引数名はオーバーロードに関係ない
オーバーロードする時に、この2つは必ず守って下さい。
コンパイルエラーになるので。最初の方でも書いたけど・・・
† 地球の末路!? †
2019年11月06日
基本挿入法(挿入ソート)
挿入ソートは、ソートされている要素へ
ソートされていない要素から取り出した要素を挿入して比較し
ソートしていく方法です。
最初は、インデックス0をソート済みとして挿入・比較を行います。
public class Demo {
public static void main(String[] args) {
int[] num = { 5, 4, 6, 3, 7, 9 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = 1; i < data.length; i++) { //要素の取出し
int tmp = data[i];
int j = i;
while(0 < j && tmp < data[j - 1]) { //挿入部分の探索
data[j] = data[j - 1];
j--;
}
data[j] = tmp;
}
}
}
========== 実行結果 ==========
3 4 5 6 7 9
==============================
forのiが1から始まっているのは
インデックス0をソート済みとしているからです。
また、ソート済みの部分が確定とは限りません。
「int j = i;」にすることでiとjが連動するようになります。
iがインクリメントされて2になれば、jも2といった感じで。
whileではなくてforにするなら
初期値のところを「for(int j = i; 0 < j; j--)」みたいな感じに。
† 地球の末路!? †
ソートされていない要素から取り出した要素を挿入して比較し
ソートしていく方法です。
最初は、インデックス0をソート済みとして挿入・比較を行います。
public class Demo {
public static void main(String[] args) {
int[] num = { 5, 4, 6, 3, 7, 9 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = 1; i < data.length; i++) { //要素の取出し
int tmp = data[i];
int j = i;
while(0 < j && tmp < data[j - 1]) { //挿入部分の探索
data[j] = data[j - 1];
j--;
}
data[j] = tmp;
}
}
}
========== 実行結果 ==========
3 4 5 6 7 9
==============================
forのiが1から始まっているのは
インデックス0をソート済みとしているからです。
また、ソート済みの部分が確定とは限りません。
「int j = i;」にすることでiとjが連動するようになります。
iがインクリメントされて2になれば、jも2といった感じで。
whileではなくてforにするなら
初期値のところを「for(int j = i; 0 < j; j--)」みたいな感じに。
† 地球の末路!? †
2019年11月04日
基本選択法(選択ソート)
配列の中から探索した最小値または最大値と
その他の要素を比較してソートしていくのが基本選択法です。
選択ソートとも言われます。
最初は、配列のインデックス0を仮の最小値としてソート開始します。
下記は、最小値を探索して要素をソートするアルゴリズムです。
public class Demo {
public static void main(String[] args) {
int[] num = { 50, 30, 10, 20, 5, 90, 15, 2, 9 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = 0; i < data.length - 1; i++) { //最小値との入替え
int min = i; //仮の最小値
for(int j = i + 1; j < data.length; j++) { //最小値の探索
if(data[j] < data[min]) {
min = j;
}
}
int tmp = data[i];
data[i] = data[min];
data[min] = tmp;
}
}
}
========== 実行結果 ==========
2 5 9 10 15 20 30 50 90
==============================
内側のforで探索して見つけた最小値と仮の最小値の交換を
外側のforで行っています。
バブルソートのように1ループで複数交換を繰り返すのではなくて
選択ソートは、1ループで1回交換になります。
仮の最小値とそれ以外の要素を比較して1回交換。
次もまた仮の最小値とそれ以外の要素を比較して1回交換。
またまた次も仮の最小値とそれ以外の要素を比較して1回交換。
と、こんな感じの処理が繰り返されてソートされます。
条件を満たしていない時には交換されません。
外側のforが「data.length - 1」になっているのは
選択ソートが、データN個に対して
「N(N - 1)/2」回の比較と「N - 1」回の交換を行うから。
† 地球の末路!? †
その他の要素を比較してソートしていくのが基本選択法です。
選択ソートとも言われます。
最初は、配列のインデックス0を仮の最小値としてソート開始します。
下記は、最小値を探索して要素をソートするアルゴリズムです。
public class Demo {
public static void main(String[] args) {
int[] num = { 50, 30, 10, 20, 5, 90, 15, 2, 9 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = 0; i < data.length - 1; i++) { //最小値との入替え
int min = i; //仮の最小値
for(int j = i + 1; j < data.length; j++) { //最小値の探索
if(data[j] < data[min]) {
min = j;
}
}
int tmp = data[i];
data[i] = data[min];
data[min] = tmp;
}
}
}
========== 実行結果 ==========
2 5 9 10 15 20 30 50 90
==============================
内側のforで探索して見つけた最小値と仮の最小値の交換を
外側のforで行っています。
バブルソートのように1ループで複数交換を繰り返すのではなくて
選択ソートは、1ループで1回交換になります。
仮の最小値とそれ以外の要素を比較して1回交換。
次もまた仮の最小値とそれ以外の要素を比較して1回交換。
またまた次も仮の最小値とそれ以外の要素を比較して1回交換。
と、こんな感じの処理が繰り返されてソートされます。
条件を満たしていない時には交換されません。
外側のforが「data.length - 1」になっているのは
選択ソートが、データN個に対して
「N(N - 1)/2」回の比較と「N - 1」回の交換を行うから。
† 地球の末路!? †
2019年11月02日
基本交換法(隣接交換法、バブルソート)
基本交換法は、隣り合う要素を比較してソートする方法。
隣接交換法やバブルソートとも言われます。
public class Example4 {
public static void main(String[] args) {
int[] num = { 5, 30, 10, 20, 70, 90 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = data.length - 1; 0< i; i-- ) { //比較範囲の縮小
for(int j = 0; j < i; j++) { //要素の比較、入替え
if(data[j] > data[j + 1]) {
int tmp = data[j + 1];
data[j + 1] = data[j];
data[j] = tmp;
}
}
}
}
}
===== 実行結果 =====
5 10 20 30 70 90
====================
† 地球の末路!? †
隣接交換法やバブルソートとも言われます。
public class Example4 {
public static void main(String[] args) {
int[] num = { 5, 30, 10, 20, 70, 90 };
sort(num);
for(int s : num) {
System.out.print(s + " ");
}
}
public static void sort(int[] data) {
for(int i = data.length - 1; 0< i; i-- ) { //比較範囲の縮小
for(int j = 0; j < i; j++) { //要素の比較、入替え
if(data[j] > data[j + 1]) {
int tmp = data[j + 1];
data[j + 1] = data[j];
data[j] = tmp;
}
}
}
}
}
===== 実行結果 =====
5 10 20 30 70 90
====================
† 地球の末路!? †