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

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

ただいまの
回答率

91.35%

  • JavaScript

    11211questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1222questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。

ビット演算子について勉強したいのですが、つまづいています。

受付中

回答 3

投稿 2017/11/23 14:10 ・編集 2017/11/23 15:09

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

momiyage

score 0

ビット演算子についての理解を深めたいです。そこで、ネットで検索して勉強しようと思ったのですが、読んでもよくわからないのと、実際、手を動かして動作確認しながら理解を深めようとターミナルでnodeを起動してビット演算をしてみたりしたのですが、書き方によって出てくる結果が変わったりしてどのように勉強したら良いのかわからずつまづいてます。

一応、2進数や8進数、10進数について理解していなかったので、今回、ビット演算子の勉強を行う上で、これらについては勉強し理解はしたような気はします。

とりあえず今はビット演算を勉強する上で、2段階で考えています。(この先の段階も勉強を進めていくにしたがって、自然と見えてくる気はしますが今はこの2段階で。)

  1. ビット演算子を理解する
  2. ビットシフト演算子を理解する

今回は1のビット演算子を理解するところに焦点を絞って質問をさせて頂ければ幸いです。

質問1

Macにnode.js環境はあるので、ビット演算子を手を動かしながら勉強する上で、ターミナルでnodeを立ち上げて、そこでコードを打ち込んで学習するか、chromeのコンソールで打ち込んで学習するかを検討しています。

> 0b1100 & 0b0111
4
> 1100 & 0111
72

ターミナルでnodeを立ち上げて、上記を実行するとまず出てくる結果が異なります。ブラウザーの履歴から見つけることが出来なかったので参考にしたサイトにリンクを貼れなくて恐縮ですが、その参考にしたサイトではC言語のGCCだか何かを使うから、0bをここでは先頭につけて実行しますみたいなことが書いてあったので、0bを先頭につけてみると、上のような結果になりました。

ただ、0bを外したらどうなるのだろうと思って、実行したのが上のコードの下のものなのですが、出てくる回答が異なりました。

ここで1つ目の質問なのですが、僕はビット演算の勉強をするにあたって、どういった環境(ターミナル?クロムのconsole?)を使ったほうが良くて、その場合、「0b」をつけるべきなのか、つけないべきなのか、そもそも、0bって何なのかが知りたいのです。

そして、2つ目の質問は「&」は、数字が両方同じなら1にしてそうじゃければ0にするみたいな解説があったので、例えば、「1100 & 0111」とあったら結果は「1000」になるのかなと思ったのですが、なぜか72が出力されています。これは何故なのでしょうか?「&」は両方同じなら1の値をかえすみたいな表現の理解を誤解しているのでしょうか?

いろいろと質問してしまって恐縮ですが、勉強もろくにスタート出来ない低次元のところでつまづいてしまって進まないので、お力をお貸しいただければ幸いです。

よろしくおねがいいたします。

 理解の確認

  • 0bから始まる - binary - 2進数
  • 0o or 0から始まる - octa - 8進数
  • oxから始まる - hex - 16進数

ビット演算子は演算対象が2進数でない場合は、まず2進数に値が変換されてから行われる。ビット演算子の結果は10進数の値で返る

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

0bとは,「これは二進数ですよ」という印です.
つけない場合は,十進数として解釈されます.

つまり,1100 & 0111の場合は,十進数として認識され,一度二進数に変換してから計算しているわけです.
二進数として扱いたい場合は,だいたいの場面で0bはつけるべきです.

環境は,とりあえず使いやすいものを使えば良いと思います.
不便が生じた時に他のものを試せば良いでしょう.

投稿 2017/11/23 14:45

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 15:10

    ご回答ありがとうございます。理解が深まりました!

    キャンセル

0

JavaScriptを学ぶのであればmozillaのチュートリアルをおすすめします.

https://developer.mozilla.org/ja/docs/Web/JavaScript

JavaScriptにおける数値リテラル, ビット演算子の記法から確認して下さい.


と, 解説もないのはアレなので


JavaScriptにおける整数リテラルの記述には基数(n進数)指定にルールがあり, 

  • 0以外の数字から始まる→10進数
  • 0から始まるもしくは0oから始まる→は8進数
  • 0xから始まる→16進数
  • 0bから始まる→2進数

と解釈されます.

さて式1100 & 0111の計算結果が72となる理由ですが

  • 1100は10進数なのでこれを2進数で表すと10001001100
  • 01118進数なのでこれを2進数で表すと1001001

となるため, 
10001001100 & 
00001001001 =
00001001000
であり, この00001001000は10進数表記で72というわけです.


ビット演算子は演算対象が2進数でない場合は、まず2進数に値が変換されてから行われる。ビット演算子の結果は10進数の値で返る 

違います. 

「整数型の文字列表現として2進・8進・10進・16進がある」のです. ソースコード上で数値を表現する際に何らかの文字列で値を表さなければならないので, このようなルールがあるのです. これは計算結果をコンソールに文字列として表示する際にも必要となるため, 通常は(直感的に判りやすい)10進表記が用いられているのです.

もちろん2進数や8進数表記が便利な場合もありますから, それらをサポートする関数があります.

  • parseInt([数値文字列], [基数])
  • Integer.toString([基数])

ビット演算子は整数型を「2進数として考え, その桁ごとに計算を行う」もので, 出力結果が2進数というわけではありません.

投稿 2017/11/23 14:18

編集 2017/11/23 15:24

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2017/11/23 15:11

    ご回答ありがとうございます!2進数をちゃんとわかっていなかったので、先ほどyoutube上にアップされてた動画を数本見て、理解を深めました。8進数は0から始まる場合もなのですね。ありがとうございます。ちなみに質問に理解の確認として追記したのですが、合っていますでしょうか?

    キャンセル

0

 Number 型

JavaScript(ECMAScript)ではNumber型の値は一種類であり、2,8,10,16進数表記は内部的に全て同種の数値(Number型)です。

alert(0b0100); // 4
alert(4);            // 4
alert(0o4);       // 4
alert(0x4);       // 4
alert(0b0100 === 4); // true

 基数変換

> 0b1100 & 0b0111
4
> 1100 & 0111
72

ビット演算子は二進数で演算する為、全ての数値を二進数に基数変換して考えなければなりません。

alert((0b1100 & 0b0111).toString(2));   // "100"
alert((0b1100 & 0b0111) === 0b0100); // true

alert((1100).toString(2));   // "10001001100"
alert((0111).toString(2));   // "1001001"
alert((72).toString(2));       // "1001000"
alert(0b1001000 === 72); // true
alert((0b10001001100 & 0b1001001) === 0b1001000); // true

N進数から10進数に変換する考え方は「N進数 10進数 変換」でGoogle検索すればHITする為、割愛します。

Re: momiyage さん

投稿 2017/11/23 17:26

編集 2017/11/23 17:28

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.35%

関連した質問

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

  • JavaScript

    11211questions

    JavaScriptは、プログラミング言語のひとつです。ネットスケープコミュニケーションズで開発されました。 開発当初はLiveScriptと呼ばれていましたが、業務提携していたサン・マイクロシステムズが開発したJavaが脚光を浴びていたことから、JavaScriptと改名されました。 動きのあるWebページを作ることを目的に開発されたもので、主要なWebブラウザのほとんどに搭載されています。

  • Node.js

    1222questions

    Node.jsとはGoogleのV8 JavaScriptエンジンを使用しているサーバーサイドのイベント駆動型プログラムです。