Rainbow Engine

IT技術を分かりやすく簡潔にまとめることによる学習の効率化、また日常の気付きを記録に残すことを目指します。

C++

C++における「>>」の意味について

投稿日:2021年12月10日 更新日:

 

<目次>

(1) C++における「>>」の意味について
 (1-1) 概要
 (1-2) サンプルプログラム
 (1-3) どんな時に使われる?⇒データ圧縮
 (1-4) 備考

(1) C++における「>>」の意味について

(1-1) 概要

C++において「>>」や「<<」は「ビットシフト演算子」と呼ばれており、値に対応するビット列を右や左にシフトさせるための演算子です。「>>」はビットの右シフトを表しており、逆に「<<」はビットの左シフトを表しています。

(構文)

[変数] << [シフトするビット数]
 
例えば、10進数の「8」(=2進数の「00001000」)を左に3ビットシフトした場合は「01000000」(=10進数の「64」)になります。全てのビットを左に3桁分シフトさせて、空いた部分を0でパディング(詰める)しています。

(例)

//# 10進数の8 = 2進数の00001000
int before = 8;
bitset<8> before_bin(before);
cout << before << " = " << before_bin << endl;

//# 左に3ビットシフト
//# 2進数の01000000 = 10進数の64
int after = before << 3;
bitset<8> after_bin(after);
cout << after << " = " << after_bin << endl;

(図111)

(注意点)
iostreamライブラリのcoutやcinオブジェクトと一緒に「<<」や「>>」が使われる場合は意味が異なっており、このケースでは標準出力や標準入力をするための「ストリーム挿入演算子」として使われます。

目次にもどる

(1-2) サンプルプログラム

「t >> 4」は変数「t」の値を取り出し、右に4ビット分、シフトさせます。


(サンプルプログラム)

#include <iostream>
#include <bitset>
using namespace std;

int main()
{
	//# tの値が350とします。
	int t = 350;
	bitset<8> t_0(t);
	cout <<  t << " = " << t_0 << endl;

	//# 10進数の「350」は、16進数だと「0x15E」です。
	//# 10進数の「350」は、2進数では「0001 0101 1110」です。
	//# この350を右に5ビット分、シフトさせます。
	int hoge = t >> 5;

	//# 具体的には次のように1桁ずつ右にシフトさせていきます。
	//# t >> 0は初期状態で、そこから5桁右にズラします。

	//# t >> 0 = 0001 0101 1110
	//# t >> 1 = 0000 1010 1111
	//# t >> 2 = 0000 0101 0111
	//# t >> 3 = 0000 0010 1011
	//# t >> 4 = 0000 0001 0101
	//# t >> 5 = 0000 0000 1010

	//# 「0000 0000 1010」の値は16進数では「A」、10進数では「10」となります。
	//# よって、hoge = t >> 5 = 10 となります。
	bitset<8> t_5(hoge);
	cout << hoge << " = " << t_5 << endl;
}

(図121)

目次にもどる

(1-3) どんな時に使われる?⇒データ圧縮

ファイル等のデータを圧縮したい場合などで使う事ができます。つまり、1バイトの情報を保持するのに8ビット以下のデータで済むようなエンコード方式を使う事で圧縮が可能です。
 
例えば、「Base64」の場合、A~Z、a~z、0~9、+、/の合計64文字で表現する形で変換するため、データを圧縮する事ができます(→★Base64)
 
ただし、CやC++において「ビット」を扱うデータ単位は存在しないため、こういった圧縮処理をするにしても、前述の「ビットシフト演算子」を使って「バイト」単位にデータを操作する形になります。
 

(1-4) 備考

●もしシフトできる範囲を超えた場合はどうなる?
例えば10進数の128(=2進数の10000000)を左にシフトした場合はどうなるでしょうか?1ビットでは最大255までしか表現できないため、128を左に1ビットシフトして256にした場合は収まらずに溢れてしまします。このケースでは結果は「00000000」になります。

目次にもどる

Adsense審査用広告コード


Adsense審査用広告コード


-C++

執筆者:


comment

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

関連記事

ValgrindのPossibly Lostの意味や実際のサンプルをご紹介

  <目次> (1) ValgrindのPossibly Lostの意味や実際のサンプルをご紹介  (1-1) Valgrindの「Possibly Lost」はどんな状況?  (1-2) …

パイプ通信とは?概要やサンプルプログラムをご紹介

  <目次> (1) パイプ通信とは?概要やサンプルプログラムをご紹介  (1-1) パイプ通信の概要  (1-2) パイプ通信の構文  (1-3) パイプ通信のサンプルプログラム①(単一プ …

C++のunsigned char型とは?概要やsigned charとの違いもご紹介

<目次> (1) C++のunsigned char型とは?概要やsigned charとの違いもご紹介  (1-1) 概要  (1-2) サンプルプログラム①:疎通確認 (1) C++のunsign …

Valgrindの使い方や見方について(基礎編)

  <目次> (1) Valgrindの使い方や見方について(基礎編)  (1-1) メモリリークのチェックのやり方  (1-2) 「valgrind」コマンドの基本的な使い方  (1-3) …

C++のfork関数の構文や使い方について

  <目次> (1) C++のfork関数の構文や使い方について  (1-1) fork()関数とは?概要や目的  (1-2) fork()関数の構文  (1-3) fork()関数のサンプ …

  • English (United States)
  • 日本語
Top