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

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

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

5回答

1843閲覧

(byte)(value>>8)をpythonで表現するにはどうすればよいでしょうか?

hiroshi_komura

総合スコア15

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2016/07/06 01:20

編集2016/07/07 00:14

現在C言語で書かれたプログラムをもとに、pythonで書き直しています。

そこでタイトルの所でつまづきました。

unsigned long型のvalueを使って、(byte)(value>>8)を表現するにはどう知ればいいでしょうか?

もし方法を知っていらっしゃれば、ご回答をぜひ宜しくお願いします。

<追記>
print(type(value))した場合、整数値を受け取った場合はintになり、小数を入れた場合はfloatが帰ってきました。

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

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

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

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

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

yohhoy

2016/07/06 03:24 編集

変数valueはどのように計算/取得/読み込んだ値でしょうか?また変数の正確な型は何でしょう? print(type(value)) で確認できます。
guest

回答5

0

https://docs.python.org/3/reference/expressions.html#shifting-operations

https://docs.python.org/3/reference/expressions.html#binary-bitwise-operations
の組み合わせでいいんじゃないかなと思いますが、なんか違いましたか?

投稿2016/07/06 01:25

matobaa

総合スコア2493

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

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

hiroshi_komura

2016/07/06 01:30 編集

「valueをintにしなさい、floatは受け付けません」と言われてしまうのです....。 ちなみにCではちゃんとunsigned long型としてvalueを宣言しましたが、python上ではなんの型情報も入れずに2.132とか代入しています。
hiroshi_komura

2016/07/06 01:48

すみません、せっかくいただいたアドバイスなのですが理解できておりません。 floatをintにすると当然のように小数点が切り捨てられますが...2.132*1000とかにして小数点をなくしintにするということでしょうか..? 私的にはunsigned long型として扱いたいのですが、pythonで自動的にfloatになってしまいます。しかし、それでも使えそうだなと甘んじています。
matobaa

2016/07/06 06:01

なんだかおかしなことになってますね。yohhoyさんが修正依頼で指摘されているとおり、「変数valueはどのように計算/取得/読み込んだ値でしょうか?」あたりがおかしい雰囲気です。 まずはそっちの問題を解決したほうがよさそうです。別途「unsigned long として扱いたいが float になっている」のような質問を立てて詳細を書いていただければ拝見します。
matobaa

2016/07/07 01:52

質問の追記を受けて……「私的にはunsigned long型として扱いたい」とのことですが、もともとのC言語で書かれたプログラムでは、valueで整数と小数のどちらを扱おうとしていたのでしょうか。整数として扱いたいという前提なら、そこに小数がくるあたりの設計がおかしい、小数として扱いたいという前提なら、それをビットシフトしようとしているあたりの設計が矛盾している。どちらも設計の話になってくるので、まずは value をどう扱いたいのかを教えてください。
guest

0

自己解決

すみません!複数の型にご指摘いただいた通り元のプログラミでは、この式を実行する前に整数型に変換して受け渡しておりました!
pythonのintというか整数型は範囲が広いことが分かったので、そのままintにすることで解決しました。

お騒がせしてすみません、ありがとうございました。

投稿2016/07/09 10:18

hiroshi_komura

総合スコア15

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

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

0

unsigned long型のvalueを使って、(byte)(value>>8)を表現するにはどう知ればいいでしょうか?
print(type(value))した場合、整数値を受け取った場合はintになり、小数を入れた場合はfloatが帰ってきました。

コンピュータ上での数値の扱いについて、根本的な誤解があるように思えます。確認された通り、Pythonでは「整数値を受け取った場合はintになり、小数を入れた場合はfloat」になりますが、floatのような浮動小数点数に対して >> のようなビット単位演算は行えません(その結果を定義できません)。

本当にやりたいことを一度整理された方が良いです。

投稿2016/07/07 03:00

yohhoy

総合スコア6191

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

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

0

「なぜかfloatになっている」との事ですが。

pythonのバージョンは3ですか?
python3では除算の結果は(たとえintどうしでも)floatになります。
例えばCやpython2で「1 / 2」の結果は「0」になりますが、python3だとfloat(「0.5」)になります。
同じように書くならば、「1 // 2」と書きます。

python

1Python 3.5.1+ (default, Mar 30 2016, 22:46:26) 2[GCC 5.3.1 20160330] on linux 3Type "help", "copyright", "credits" or "license" for more information. 4>>> type(1 / 2), 1 / 2 5(<class 'float'>, 0.5) 6>>> type(1 // 2), 1 // 2 7(<class 'int'>, 0) 8>>>

かなり憶測が入っていますが、心当たりはありますでしょうか。

投稿2016/07/06 13:51

katsuko

総合スコア3469

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

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

hiroshi_komura

2016/07/07 02:10

今の所使用しているのは3ではありません
guest

0

こんにちは。

matobaaさんへのコメントも見てます。
pythonを知らないので直接の回答ができませんが、ヒントにはなると思います。

そもそもbyteへキャストしているということは、小数点以下の値は切り捨てていると思います。
また、byteは字面からしてunsigned char型と思いますが、その通りでしょうか?

x >> 8は8ビット右シフトですから256で割るのとほぼ同じです。
unsigned charへキャストするということは、8ビットを超える部分を0へ切り捨てますので、256の剰余と同じです。

であれば、まずvalueの小数点以下を切り捨てて整数とし、256で割った後、256の剰余を求めればよいと思います。


Cではちゃんとunsigned long型としてvalueを宣言しましたが、python上ではなんの型情報も入れずに2.132とか代入しています。

元のCプログラムでもunsigned long型に2.132を代入しているのでしょうか?
その時点で切り捨てられると思います。なぜにわざわざ小数値を代入するのでしょうか? 単にvalue=2;ではだめなのですか?

投稿2016/07/06 07:38

編集2016/07/06 07:38
Chironian

総合スコア23272

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問