トップへ戻るニュースフォーラムFLASH-ML 過去ログBak@Flaダウンロードよくある質問と答
ログイン
ユーザ名:

パスワード:


パスワード紛失

新規登録
メインメニュー
メイン
   コーダーズルーム【スクリプト系】
     ビット単位演算 ARGB
投稿するにはまず登録を

スレッド表示 | 新しいものから 前のトピック | 次のトピック | 下へ
投稿者 スレッド
永井勝則
Åê¹ÆNo.23081
投稿日時: 2006-1-24 14:54
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
ビット単位演算 ARGB
先の進数変換についてと類似した質問です。

macromediaのFlash Articleに
ビット単位演算子を使ったビットとカラーの操作
というのがあって、そこで以下のスクリプトが書かれています。


var argb:Number = 0xFFC97B33;
//alphaの分離
var alphaMask:Number = 0xFF000000;
var alpha:Number = argb & alphaMask;
trace("Alpha: "+alpha.toString(16));
//redの分離
var redMask:Number = 0x00FF0000;
var red:Number = argb & redMask;
trace("Red: "+red.toString(16));
//greenの分離
var greenMask:Number = 0x0000FF00;
var green:Number = argb & greenMask;
trace("Green: "+green.toString(16));
//blueの分離
var blueMask:Number = 0x000000FF;
var blue:Number = argb & blueMask;
trace("Green: "+blue.toString(16));


記事によるとこのスクリプトの出力は
Alpha:FF000000
Red:C90000
Green:7B00
Blue:33
になると書かれていますが、当方での出力は、

Alpha: -1000000
Red: c90000
Green: 7b00
Green: 33、
と、AlphaはFFになりません。

この-1とは一体どういうこと? で何を意味しているのでしょう?


----------------
永井勝則:
himco.jp :

ひろゆき
Åê¹ÆNo.23084
投稿日時: 2006-1-24 16:27
ちょんまげら
居住地: 東京砂漠
投稿: 4403
使用環境:
10.8.5

Flash Professional CS4/CS6/CC

Safari 6.1
Re: ビット単位演算 ARGB
ちょっと試してみました。

var argb:Number = 0x7FC97B33; だと、

Alpha:7f000000
Red:c90000
Green:7b00
Blue:33

と出力されますが、

var argb:Number = 0x80C97B33; だと、

Alpha:-(0000000
Red:c90000
Green:7b00
Blue:33

と出力されます!

そして、
var argb:Number = 0x81C97B33; だと、

Alpha:-7f000000
Red:c90000
Green:7b00
Blue:33

と出力されます!


----------------
質問する際は、回答者に具体的な情報を与えてください。

野中文雄
Åê¹ÆNo.23092
投稿日時: 2006-1-24 18:42
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ビット単位演算 ARGB
桁が足りないようですね。(^^;

ARGBで32ビットあればよさそうに思えますが、正負の記号が先頭のビットを使っています。したがって、アルファの部分を考えると、+7Fの01111111のつぎは先頭のビットが立ってマイナスと評価されてしまうのでしょう。
var val:Number = 0x7F000000;
trace(val.toString(2));  // 出力: 1111111000000000000000000000000
trace((val >> 24).toString(16));  // 出力: 7f
trace((val >> 24).toString(2));  // 出力: 1111111
val = 0x80000000;
trace((val >> 24).toString(16));  // 出力: -80
trace((val >> 24).toString(2));  // 出力: -10000000
val = 0x81000000;
trace((val >> 24).toString(16));  // 出力: -7f
trace((val >> 24).toString(2));  // 出力: -1111111

無理矢理アルファ値を文字列出力しようとすれば、こんな感じでしょうか。
var argb:Number = 0xFFC97B33;
//alphaの分離
var alphaMask:Number = 0xFF;
var alpha:Number = (argb >> 24) & alphaMask;
trace("Alpha: "+alpha.toString(16)+"000000"); // 出力: Alpha: ff000000


----------------
 

永井勝則
Åê¹ÆNo.23093
投稿日時: 2006-1-24 19:44
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: ビット単位演算 ARGB
検証ありがとうございます。
何やら詳細はよくわかりませんが、7Fまでは数えられるが、それより大きくなるとおかしくなる、ということかと理解しました。
Flash Playerの不具合なのでしょうかねぇ。
ともあれありがとうございました。


----------------
永井勝則:
himco.jp :

野中文雄
Åê¹ÆNo.23094
投稿日時: 2006-1-24 20:59
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ビット単位演算 ARGB
アルファが7桁しかないことに、ご注目ください。残された先頭のビットは正負の符号として扱われ、1はマイナスとなります。
引用:
野中文雄は書きました:
var val:Number = 0x7F000000;
trace(val.toString(2));  // 出力: 1111111000000000000000000000000

引用:
永井勝則さんは書きました:
何やら詳細はよくわかりませんが、7Fまでは数えられるが、それより大きくなるとおかしくなる、ということかと理解しました。

32ビット符号付き整数として処理されるのは、JavaScriptも同じようですね。仕様というべきなのかもしれません。
引用:
Flash Playerの不具合なのでしょうかねぇ。

以下の[出力]結果を検討されるといかがでしょう。
var val:Number = 0x7F000000;
trace(["val", (val >> 24).toString(16), (val >> 24).toString(2)]);
val += 0x01000000;
for (var i:Number = -0x80; i<0x00; i += 0x10) {
	trace(["i", i.toString(16), i.toString(2)]);
	trace(["val", (val >> 24).toString(16), (val >> 24).toString(2)]);
	val += 0x10000000;
}

// [出力]:
val,7f,1111111
i,-80,-10000000
val,-80,-10000000
i,-70,-1110000
val,-70,-1110000
i,-60,-1100000
val,-60,-1100000
i,-50,-1010000
val,-50,-1010000
i,-40,-1000000
val,-40,-1000000
i,-30,-110000
val,-30,-110000
i,-20,-100000
val,-20,-100000
i,-10,-10000
val,-10,-10000


----------------
 

永井勝則
Åê¹ÆNo.23114
投稿日時: 2006-1-25 16:51
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: ビット単位演算 ARGB
先生、わかりません。
最初の出力
val,7f,1111111
は、ここまでは正常に動作する、ということかと思います。
その後から分かりません。
val += 0x01000000;
のvalを出力すると、2147483648となります。
この10桁の数値の意味、加算している意味すら分かりません。
その後のfor以下は、さっぱり分かりません。
分からないので、1行ずつ日本語解説を入れていただけると非常にありがたいです。


----------------
永井勝則:
himco.jp :

野中文雄
Åê¹ÆNo.23115
投稿日時: 2006-1-25 17:32
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ビット単位演算 ARGB
0x7f = 01111111
+0x01すると、本来はこうなるはずです。
0x80 = 1011111110000000
ところが、アルファの先頭のビットは、正負の記号として認識されます。したがって、値がマイナスに変わります。しかし、(0x80000000>>24)とすれば、値は1011111110000000として復活します。ただし符号は変化しないため、つぎのような結果となる訳です。
(0x80000000>>24) -> -80

値がマイナスに変わりましたので、以降数値を加算すれば、絶対値が減少する方向で推移します。


----------------
 

raiha
Åê¹ÆNo.23144
投稿日時: 2006-1-26 9:34
新米
居住地:
投稿: 14
使用環境:
WinXP,Flash MX2004 Pro
Re: ビット単位演算 ARGB
こんにちわ。

誤記だと思いますが、

0x80 = 10000000

です
野中文雄
Åê¹ÆNo.23145
投稿日時: 2006-1-26 9:57
ちょんまげら
居住地: 東京
投稿: 4531
使用環境:
CS5.5 .6.8 Vista Home Premium (SP1)
Re: ビット単位演算 ARGB
おっと、失礼しました。怪しい暗算をしたらいけませんね。そりゃ、そうですよね。桁が繰上がるんですから。訂正しました。
引用:
raihaさんは書きました:
誤記だと思いますが、

0x80 = 10000000

です


----------------
 

永井勝則
Åê¹ÆNo.23163
投稿日時: 2006-1-27 11:00
職人
居住地: 白馬村
投稿: 796
使用環境:
Windows 7 :Flash CS4:
10.6.8 :Flash CS5.5
Re: ビット単位演算 ARGB
一意専心、焼尽いや精進します。


----------------
永井勝則:
himco.jp :

(1) 2 »
スレッド表示 | 新しいものから 前のトピック | 次のトピック | トップ

投稿するにはまず登録を
 
Copyright (C) 2003 FLASH-japan. All rights reserved.
Powered by Xoops