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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Node.js

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

JavaScript

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

Q&A

3回答

3199閲覧

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

momiyage

総合スコア6

Node.js

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

JavaScript

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

0グッド

1クリップ

投稿2017/11/23 05:10

編集2017/11/23 06:09

ビット演算子についての理解を深めたいです。そこで、ネットで検索して勉強しようと思ったのですが、読んでもよくわからないのと、実際、手を動かして動作確認しながら理解を深めようとターミナルで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進数の値で返る

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

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

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

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

投稿2017/11/23 05:45

Yatima

総合スコア1159

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momiyage

2017/11/23 06:10

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

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 05:18

編集2017/11/23 06:24
defghi1977

総合スコア4756

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momiyage

2017/11/23 06:11

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

0

Number 型

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

JavaScript

1alert(0b0100); // 4 2alert(4); // 4 3alert(0o4); // 4 4alert(0x4); // 4 5alert(0b0100 === 4); // true

基数変換

JavaScript

1> 0b1100 & 0b0111 24 3> 1100 & 0111 472

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

JavaScript

1alert((0b1100 & 0b0111).toString(2)); // "100" 2alert((0b1100 & 0b0111) === 0b0100); // true 3 4alert((1100).toString(2)); // "10001001100" 5alert((0111).toString(2)); // "1001001" 6alert((72).toString(2)); // "1001000" 7alert(0b1001000 === 72); // true 8alert((0b10001001100 & 0b1001001) === 0b1001000); // true

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

Re: momiyage さん

投稿2017/11/23 08:26

編集2017/11/23 08:28
think49

総合スコア18162

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問