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

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

関連記事

C++の値渡しと参照渡しの使い分けや違いについて

<目次> (1) C++の値渡しと参照渡しの使い分けや違いについて  (1-1) 「値渡し」とは?  (1-2) 「参照渡し」とは?  (1-3) 「値渡し」と「参照渡し」の使い分け (1) C++の …

no image

Base64のプログラムのサンプル(C++言語)と解説

  <目次> (1) Base64のプログラムのサンプル(C++言語)と解説  (1-1) Base64とは?  (1-2) Base64のプログラム例(C++) (1) Base64のプロ …

C++のtime関数やtime_t型の使い方について

  <目次> (1) C++のtime関数やtime_t型の使い方について  (1-1) C++のtime関数とtime_t型とは?  (1-2) C++のtime_t関数のサンプル (1) …

C++のポインタとは?概念や基本的な使い方をご紹介

  <目次> (1) C++のポインタとは?概念や基本的な使い方をご紹介  (1-1) はじめに  (1-2) ポインタとは? (1) C++のポインタとは?概念や基本的な使い方をご紹介 「 …

C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処

  <目次> (1) C++で「静的でないメンバー参照は特定のオブジェクトを基準とする相対参照である必要があります」エラーが出た時の対処  (1-1) エラーメッセージ  (1-2) 原因 …

  • English (United States)
  • 日本語
Top