約 2,074,459 件
https://w.atwiki.jp/my-sql/pages/26.html
HOME 関数 各データ型共通の演算子 論理演算子 論理演算子 SQL では、すべての論理演算子は、TRUE、FALSE、または NULL(UNKNOWN)を返します。 MySQL では、これは 1(TRUE)、0(FALSE)、NULL として実装されています。ほとんどの場合、これらの値は異なる SQL データベース間で共通していますが、場合によっては、TRUE に対してゼロ以外の値が返ることもあります。 NOT , ! 論理 NOT。 オペランドが 0 の場合は 1 を返し、ゼロでない場合は 0 を返し、NOT NULL の場合は NULL を返す。 mysql SELECT NOT 10; - 0 mysql SELECT NOT 0; - 1 mysql SELECT NOT NULL; - NULL mysql SELECT ! (1+1); - 0 mysql SELECT ! 1+1; - 1 最後の例の場合、式が (!1)+1 と同様に評価されるため、1 が返る。 AND , 論理積。 すべてのオペランドがゼロでも NULL でもない場合は 1 を返し、1 つ以上のオペランドが 0 の場合は 0 を返す。それ以外の場合は NULL を返す。 mysql SELECT 1 1; - 1 mysql SELECT 1 0; - 0 mysql SELECT 1 NULL; - NULL mysql SELECT 0 NULL; - 0 mysql SELECT NULL 0; - 0 注意 4.0.5 より前のバージョンの MySQL では、NULL が検出されると、使用可能な 0 値をチェックするプロセスが継続されずに、評価が停止される。そのため、これらのバージョンの場合、SELECT (NULL AND 0) では 0 ではなく NULL が返る。 バージョン 4.0.5 では、引き続き可能な限り最適化を図る一方で、常に SQL標準で規定されたとおりの結果になるようコードが再設計されている。 OR , || 論理和。 いずれかのオペランドが非ゼロの場合は 1 を返し、いずれかのオペランドが NULL の場合は NULL を返します。それ以外の場合は 0 を返す。 mysql SELECT 1 || 1; - 1 mysql SELECT 1 || 0; - 1 mysql SELECT 0 || 0; - 0 mysql SELECT 0 || NULL; - NULL mysql SELECT 1 || NULL; - 1 XOR 排他論理和。 いずれかのオペランドが NULL の場合は NULL を返す。 NULL 以外のオペランドに対しては、奇数個のオペランドが非ゼロの場合は 1 を返し、それ以外の場合は 0 を返す。 mysql SELECT 1 XOR 1; - 0 mysql SELECT 1 XOR 0; - 1 mysql SELECT 1 XOR NULL; - NULL mysql SELECT 1 XOR 1 XOR 1; - 1 a XOR b は数学的に (a AND (NOT b)) OR ((NOT a) and b) と等価。 XOR はバージョン 4.0.2 で追加された
https://w.atwiki.jp/ca07/pages/27.html
new演算子 1.通常の書式 new 型名T オペランド:右オペランドに型名Tをとる 動作:T型のメモリインスタンスのためのメモリ領域を確保する 返却値:返却値は、せい背されたインスタンスへのポインタ(T*型) int * iptr = new int; 2.配列用のメモリ領域を確保するとき new 型名T [要素名] オペランド:右オペランドに型名T[要素数]をとる 動作:T型配列のインスタンスのためのメモリ領域を確保する 返却値:返却値は、生成された配列インスタンスの第1要素へのポインタ(T*型) int * iarray100 = new int[ 100 ]; ※動的確保に失敗した場合にはnew演算子はbad_alloc型の例外を投げる
https://w.atwiki.jp/0x0b/pages/95.html
mozilla JavaScriptの続き 式(Expressions)演算子(Operators) 代入演算子(Assignment Operators) 比較演算子(Comparison Operators) 算術演算子(Arithmetic Operators) ビット演算子(Bitwise Operators) 論理演算子(Logical Operators) 文字列演算子(String Operators) 特殊演算子(Special Operators) 式(Expressions) リテラル、変数、演算子、そして単一の値に評価する式からなる有効なセットです この値には数値、文字列、論理値が使用できます 概念的に、式は 2 つの種類 ある値を変数に代入するものと、単純にある値を持つもの 例えば、x = 7 という式は x に 7 という値を代入する式です。この式自体の評価結果は 7 です。このような式では代入演算子を用います。一方、3 + 4 という式では単純に評価結果が 7 になります。この式は代入を行いません。このような式で用いられる演算子は単に演算子と呼ばれます。 JavaScript には以下の種類の式があります。 算術式:数値に評価する。例えば 3.14159。(一般に 算術演算子 を使用) 文字列式:文字列に評価する。例えば "Fred" や "234"。(一般に 文字列演算子 を使用) 論理式:true または false に評価する。(よく 論理演算子 を用いる) オブジェクト式:オブジェクトに評価する。(オブジェクトに評価するさまざまな例については 特殊演算子 を参照) 演算子(Operators) JavaScript は以下の種類の演算子を使うことができます。このセクションでは演算子について説明します。また、演算子の優先順位にも触れます。 代入演算子 比較演算子 算術演算子 ビット演算子 論理演算子 文字列演算子 特殊演算子 JavaScript には単項演算子も 2 項演算子もあります。さらには唯一の特殊な 3 項演算子である条件演算子があります。2 項演算子では、演算子の前後に 1 つずつ、計 2 つのオペランドが必要です。 operand1 operator operand2 例えば 3+4 や x*y。 単項演算子では、演算子の前か後ろどちらかに 1 つのオペランドが必要です。 operator operand または operand operator 例えば x++ や ++x。 演算子の優先順位 演算子の優先順位が高い順 |は| 演算子の種類 個々の演算子 メンバ . [] インスタンスの呼び出し/作成 () new 否定/インクリメント ! ~ - + ++ -- typeof void delete 乗算/除算 * / % 加算/減算 + - ビットシフト 関係 = = in instanceof 等価 == != === !== ビットごとのand ビットごとのxor ^ ビットごとの or | 論理積 論理和 || 条件 ? 代入 = += -= *= /= %= = = = = ^= |= コンマ , 代入演算子(Assignment Operators) 代入演算子は、右のオペランドの値に基づいた値を左のオペランドに代入します。基本的な代入演算子はイコール (=) ですが、これは右のオペランドの値を左のオペランドに代入します。すなわち、x = y では y の値を x に代入します。 他の代入演算子は標準的な演算をするための短縮表記があります。次の表でそれを示します。 短縮表記した演算子意味 x += y x = x + y x -= y x = x - y x *= y x = x * y x /= y x = x / y x %= y x = x % y x = y x = x y x = y x = x y x = y x = x y x = y x = x y x ^= y x = x ^ y x |= y x = x|y 比較演算子(Comparison Operators) 比較演算子は、オペランドを比較し、比較結果に基づいた論理値を返します。オペランドには数値、文字列、論理値、オブジェクトが使用できます。文字列は、Unicode 値を用いて標準的な辞書順に基づいて比較されます。ほとんどの場合、2 つのオペランドが異なる型ならば JavaScript はそのオペランドを比較に適した型に変換しようとします(このルールの唯一の例外は === および !== であり、これらは厳密に等値か否かを判断し、等値性をチェックする前にオペランドを適合する型に変換するということはありません)。これは一般に数値の比較が実行されることになります。次の表では比較演算子について説明します。次のコードで考えます。 var var1 = 3, var2 = 4; 演算子 説明 true を返す例 等しい (==) オペランドが等しい場合に true を返す 3 == var1"3" == var13 == 3 等しくない (!=) オペランドが等しくない場合に true を返す var1 != 4var2 != "3" 厳密に等しい (===) オペランドが等しく、かつ同じ型である場合に true を返す 3 === var1 厳密には等しくない (!==) オペランドが等しくなく、かつ/または同じ型でない場合に true を返す var1 !== "3"3 !== 3 より大きい ( ) 左のオペランドが右のオペランドよりも大きい場合に true を返す var2 var1"12" 2 以上 ( =) 左のオペランドが右のオペランド以上である場合に true を返す var2 = var1var1 = 3 より小さい ( ) 左のオペランドが右のオペランドよりも小さい場合に true を返す var1 var2"12" "2" 以下 ( =)|左のオペランドが右のオペランド以下である場合に true を返す|var1 = var2var2 = 5| 算術演算子(Arithmetic Operators) 算術演算子は、そのオペランドに数値(リテラルか変数)をとり、1 つの数値を返します。標準的な算術演算子は、加算 (+)、減算 (-)、乗算 (*)、除算 (/) です。これらの演算子は他のほとんどのプログラミング言語と同じように機能しますが、そのときの数値は、浮動小数点数として扱われます(0 で除算した結果は、NaN になることにも注意してください)。 1 / 2 // JavaScript では 0.5 を返す 1 / 2 // Java では 0 を返す(どちらの数も浮動小数点数として明記されていない) 1.0 / 2.0 // JavaScript でも Java でも 0.5 を返す さらに、JavaScript では以下の表で示された算術演算子も使用できます。 演算子 説明 例 %(モジュロ) 2 項演算子。2 つのオペランドで除算したときの整数の余りを返す 12 % 5 は 2 を返す。 ++(インクリメント) 単項演算子。オペランドに 1 を加える。前置演算子 (++x) を使った場合、オペランドに 1 を加えた後にその値を返す。後置演算子 (x++) を使った場合、オペランドに 1 を加える前にその値を返す。 x が 3 のとき、++x は x に 4 をセットし、4 を返す。一方、x++ は x に 4 をセットし、3 を返す。 --(デクリメント) 単項演算子。オペランドから 1 を引く。戻り値はインクリメント演算子のものと同様。 x が 3 のとき、--x は x に 2 をセットし、2 を返す。一方、x-- は x に 2 をセットし、3 を返す。 -(符号反転) 単項演算子。オペランドの符号を反転してその値を返す x が 3 のとき、-x は -3 を返す ビット演算子(Bitwise Operators) ビット演算子ではそのオペランドを 10 進数や 16 進数や 8 進数ではなく、32 ビットの集合(0 と 1)として扱います。例えば、10 進数の 9 の 2 進表現は 1001 です。ビット演算子はこのように 2 進表現にした上で演算を行いますが、標準の JavaScript の数値を返します。 次の表で JavaScript のビット演算子について説明します。 演算子 使用法 説明 ビットごとの AND a b オペランドの対応するビットがともに 1 である各ビットについて 1 を返す ビットごとの OR a|b オペランドの対応するビットがどちらかまたはともに 1 である各ビットについて 1 を返す ビットごとの XOR a ^ b オペランドの対応するビットがどちらか一方のみ 1 である各ビットについて 1 を返す ビットごとの NOT ~ a オペランドの各ビットを反転する 左シフト a b 2 進表現の a を b ビット分だけ左にシフトする。右から 0 を詰める 符号を維持した右シフト a b 2 進表現の a を b ビット分だけ右にシフトする。溢れたビットは破棄する 0 埋め右シフト a b 2 進表現の a を b ビット分だけ右にシフトする。溢れたビットは破棄し、左から 0 を詰める ビットごとの論理演算子 概念的にビットごとの論理演算子は以下のように機能します。 オペランドは 32 ビット整数に変換され、ビット列(0 と 1)として表現される。 第 1 のオペランドの各ビットは第 2 のオペランドの対応するビットと対にされる。第 1 ビットと第 1 ビット、第 2 ビットと第 2 ビット、というように対にされる。 演算子は各ビットのペアに適用され、結果はビットごとに組み立てられる。 例えば、9 の 2 進表現は 1001 で、15 の 2 進表現は 1111 です。ここで、ビット演算子がこれらの値に対して適用されたときの結果は以下のようになります。 15 9 の結果は 9 (1111 1001 = 1001) 15 | 9 の結果は 15 (1111 | 1001 = 1111) 15 ^ 9 の結果は 6 (1111 ^ 1001 = 0110) ビットシフト演算子 ビットシフト演算子は 2 つのオペランドをとります。第 1 のオペランドはシフトされる数を指定し、第 2 のオペランドは、第 1 のオペランドをシフトさせるビット数を指定します。シフト演算の方向は使用する演算子によって決まります。 シフト演算子はそのオペランドを 32 ビット整数に変換し、左のオペランドと同じ型の結果を返します。 シフト演算子は次の表のとおりです 演算子 説明 例 (左シフト) 第 1 オペランドを指定したビット数分だけ左にシフトする。左に溢れたビットは破棄される。0 のビットを右から詰める 9 2 の結果は 36 となる。1001 を 2 ビット左にシフトすると 100100 となり、これは 36 であるため (符号を維持した右シフト) 第 1 オペランドを指定したビット数分だけ右にシフトする。右に溢れたビットは破棄される。左端のビットのコピーを左から詰める 9 2 の結果は 2 となる。1001 を 2 ビット右にシフトすると 10 となり、これは 2 であるため。同様に、-9 2 の結果は符号が維持されるために -3 となる (0 埋め右シフト) 第 1 オペランドを指定したビット数分だけ右にシフトする。右に溢れたビットは破棄される。0 のビットを左から詰める 19 2 の結果は 4 となる。10011 を 2 ビット右にシフトすると 100 になり、これは 4 であるため。非負数では 0 埋め右シフトと符号を維持した右シフトは同じ結果になる 論理演算子(Logical Operators) 論理演算子では基本的に真偽(論理)値を用います。そのような値があると真偽値を返します。しかし、 および || 演算子は実際には指定されたオペランドの一方の値を返します。そのため、非真偽値とともに論理演算子が使われると非真偽値を返します。論理演算子について次の表で説明します。 演算子 使用法 説明 expr1 expr2 (論理 AND)expr1 を false と見ることができる場合は expr1 を返す。そうでない場合は expr2 を返す。したがって、真偽値が使われた場合、両オペランドが true の場合は は true を返し、そうでない場合は false を返す || expr1||expr2 (論理 OR)expr1 を true と見ることができる場合は expr1 を返す。そうでない場合は expr2 を返す。したがって、真偽値が使われた場合、どちらかのオペランドが true の場合は||は true を返し、両方とも false の場合は false を返す ! !expr (論理 NOT)オペランドを true と見ることができる場合は false を返す。そうでない場合は true を返す false と見ることができる式とは、null、0、空文字列 ("")、または undefined に評価される式のことです。 以下のコードで (論理 AND)演算子の例を示します。 a1=true true // t t は true を返す a2=true false // t f は false を返す a3=false true // f t は false を返す a4=false (3 == 4) // f f は false を返す a5="Cat" "Dog" // t t は Dog を返す a6=false "Cat" // f t は false を返す a7="Cat" false // t f は false を返す 以下のコードで ||(論理 OR)演算子の例を示します。 o1=true || true // t || t は true を返す o2=false || true // f || t は true を返す o3=true || false // t || f は true を返す o4=false || (3 == 4) // f || f は false を返す o5="Cat" || "Dog" // t || t は Cat を返す o6=false || "Cat" // f || t は Cat を返す o7="Cat" || false // t || f は Cat を返す 以下のコードで !(論理 NOT)演算子の例を示します。 n1=!true // !t は false を返す n2=!false // !f は true を返す n3=!"Cat" // !t は false を返す ショートサーキット評価 論理式は左から右に評価されるため、以下のルールを用いることで「ショートサーキット」評価ができるようになっています。 false anything は false にショートサーキット評価する。 true || anything は true ショートサーキット評価する。 論理のルールはこれらの評価が常に正確であることを保証しています。上記の式の anything の部分は評価されないため、何らかの副作用が生じないように注意してください 文字列演算子(String Operators) 比較演算子は文字列に使用できますが、これに加えて 2 つの文字列を結合する結合演算子 (+) も使用できます。これは 2 つのオペランドの文字列を結合した文字列を返します。例えば、"my " + "string" は "my string" という文字列を返します。 短縮表記した代入演算子 += も文字列の結合に使用できます。例えば、変数 mystring に "alpha" という値が格納されているとき、式 mystring += "bet" の評価結果は "alphabet" となり、この値を mystring に代入します。 特殊演算子(Special Operators) JavaScript は以下の特殊演算子があります。 条件演算子 コンマ演算子 delete in instanceof new this typeof void 条件演算子 条件演算子は JavaScript では唯一の 3 つのオペランドをとる演算子です。演算子は条件に基づいて 2 つの値のうち、1 つを選択します。構文は次のとおりです。 condition ? val1 val2 condition が true の場合、演算子は val1 の値を選択します。そうでない場合は val2 の値を選択します。標準的な演算子が使用できる場所でならどこででも条件演算子を使用することができます。 例えば、 status = (age = 18) ? "adult" "minor" この文では、age が 18 以上の場合 "adult" という値を変数 status に代入します。そうでない場合は "minor" という値を status に代入します。 コンマ演算子 コンマ演算子 (,) は単に両方のオペランドを評価し、第 2 のオペランドの値を返します。この演算子は主に for ループ内で使用されます。このことでループのたびに複数の変数を更新できるようになります。 例えば、a が一辺が 10 要素の 2 次元配列のとき、以下のコードではコンマ演算子を用いることで 2 変数を同時にインクリメントしています。このコードでは配列の対角成分の値を出力します。 for (var i=0, j=9; i = 9; i++, j--) document.writeln("a["+i+"]["+j+"]= " + a[i][j]) delete delete 演算子はオブジェクトやオブジェクトのプロパティ、配列の指定されたインデックスの要素を削除します。構文は以下のとおりです。 delete objectName delete objectName.property delete objectName[index] delete property // with 文内でのみ有効 ここで、objectName はオブジェクトの名前を、property は既存のプロパティを、index は配列の要素の位置を表す整数をそれぞれ表しています。 4 番目の形式は with 文内でのみ有効で、これはあるオブジェクトからプロパティを削除します。 delete 演算子を使うことで暗黙的に宣言された変数を削除することができますが、var 文を用いて宣言された変数は削除できません。 delete 演算子が成功すると、そのプロパティや要素には undefined がセットされます。また、演算が可能な場合は delete 演算子は true を返します。演算が不可能な場合は false を返します。 x=42 var y= 43 myobj=new Number() myobj.h=4 // プロパティ h を作成 delete x // true を返す(暗黙的に宣言されているならば削除可能) delete y // false を返す(var 付きで宣言されているなら削除不可能) delete Math.PI // false を返す(定義済みプロパティは削除不可能) delete myobj.h // true を返す(ユーザ定義プロパティは削除可能) delete myobj // true を返す(暗黙的に宣言されているならば削除可能) 配列要素の削除 配列要素を削除したとき、配列の長さには影響を及ぼしません。例えば a[3] を削除したとき、a[4] は依然 a[4] のままで、a[3] は undefined になります。 delete 演算子で配列要素を除去すると、もうその要素はその配列からなくなります。次の例では tree[3] は delete によって除去されます。 trees=new Array("redwood","bay","cedar","oak","maple") delete trees[3] if (3 in trees) { // ここは実行されない } 配列要素は存在させたいが、値は未定義にしたいという場合は、delete 演算子の代わりに undefined キーワードを使用してください。次の例では trees[3] には undefined という値が代入されますが、その配列要素は存在したままになります。 trees=new Array("redwood","bay","cedar","oak","maple") trees[3]=undefined if (3 in trees) { // ここは実行される } in in 演算子は、指定されたプロパティが指定されたオブジェクトにある場合に true を返します。構文は以下のとおりです。 propNameOrNumber in objectName ここで、propNameOrNumber はプロパティ名か配列のインデックスを表す文字列式または数値式を、objectName はオブジェクトの名前をそれぞれ表しています。 次の例では in 演算子の使用法を示します。 // 配列 trees=new Array("redwood","bay","cedar","oak","maple") 0 in trees // true を返す 3 in trees // true を返す 6 in trees // false を返す "bay" in trees // false を返す(インデックスの指す値ではなく、 // インデックスの数字を指定しなければならない) "length" in trees // true を返す(length は Array のプロパティ) // 定義済みオブジェクト "PI" in Math // true を返す myString=new String("coral") "length" in myString // true を返す // ユーザ定義オブジェクト mycar = {make "Honda",model "Accord",year 1998} "make" in mycar // true を返す "model" in mycar // true を返す instanceof instanceof 演算子は、指定されたオブジェクトが指定されたオブジェクトの種類である場合に true を返します。構文は次のとおりです。 objectName instanceof objectType ここで、objectName は objectType と比較するオブジェクトの名前を、objectType は Date や Array のようなオブジェクトの種類をそれぞれ表しています。 実行時にオブジェクトの種類を確認する必要があるときは instanceof を使用してください。例えば、例外を受け取るとき、投げられた例外の種類によって別々の例外を扱うコードに分岐させることができます。 例えば、次のコードでは instanceof を使用することで theDay が Date オブジェクトであるかどうかを決定しています。theDay は Date オブジェクトなので if 文の中の文は実行されます。 theDay=new Date(1995, 12, 17) if (theDay instanceof Date) { // 実行される文 } new new 演算子は、ユーザ定義オブジェクトや、Array、Boolean、Date、Function、Image、Number、Object、Option、RegExp、String といった定義済みオブジェクトのインスタンスを作成するのに使用します。サーバでは DbPool、Lock、File、SendMail といったオブジェクトも使用できます。new の使用法は以下のとおりです。 objectName = new objectType ( param1 [,param2] ...[,paramN] ) オブジェクト初期化子を使用してもオブジェクトを作成することができます。オブジェクト初期化子の使用 にて説明しています。 詳しくはコア JavaScript リファレンスの new 演算子 のページを参照してください。 this this キーワードを使うことでカレントオブジェクトを参照することができます。一般に this はあるメソッド内でそのメソッドを呼び出したオブジェクトを参照します。使用法は以下のとおりです。 this[.propertyName] 例 1 あるオブジェクトの value プロパティの妥当性を確認する validate という関数を想定します。関数にはそのオブジェクトと、上限および下限の値を渡します。 function validate(obj, lowval, hival) { if ((obj.value lowval) || (obj.value hival)) alert("Invalid Value!") } 各フォーム要素の onChange イベントハンドラにおいて validate を呼び出します。this を使うことでフォーム要素を渡すことができます。次の例をご覧ください。 B Enter a number between 18 and 99 /B INPUT TYPE = "text" NAME = "age" SIZE = 3 onChange="validate(this, 18, 99)" 例 2 form プロパティと組み合わせると this でカレントオブジェクトの親のフォームを参照できます。次の例では、myForm というフォームに Text オブジェクトとボタンが格納されています。ユーザがボタンをクリックすると、Text オブジェクトの値にフォーム名がセットされます。ボタンの onClick イベントハンドラは this.form を利用して親のフォームである myForm を参照します。 FORM NAME="myForm" Form name INPUT TYPE="text" NAME="text1" VALUE="Beluga" P INPUT NAME="button1" TYPE="button" VALUE="Show Form Name" onClick="this.form.text1.value=this.form.name" /FORM typeof typeof 演算子は次の方法のうち、どちらかの方法で使用します。 1. typeof operand 2. typeof (operand) typeof 演算子は、未評価のオペランドの型を指す文字列を返します。operand は返される型を調べる対象となる文字列、変数、キーワード、オブジェクトです。括弧はあってもなくてもかまいません。 以下の変数を定義することを想定します。 var myFun = new Function("5+2") var shape="round" var size=1 var today=new Date() typeof 演算子はこれらの変数に対して以下の結果を返します。 typeof myFun is function typeof shape is string typeof size is number typeof today is object typeof dontExist is undefined true や null というキーワードに対して、typeof 演算子は以下の結果を返します。 typeof true is boolean typeof null is object 数値や文字列に対して、typeof 演算子は以下の結果を返します。 typeof 62 is number typeof Hello world is string プロパティ値に対して、typeof 演算子はプロパティ値の型を返します。 typeof document.lastModified is string typeof window.length is number typeof Math.LN2 is number メソッドや関数に対して、typeof 演算子は以下の結果を返します。 typeof blur is function typeof eval is function typeof parseInt is function typeof shape.split is function 定義済みオブジェクトに対して、typeof 演算子は以下の結果を返します。 typeof Date is function typeof Function is function typeof Math is function typeof Option is function typeof String is function void void 演算子は次の方法のうち、どちらかの方法で使用します。 1. void (expression) 2. void expression void 演算子は値を返さずに評価する式を指定します。expression は評価する JavaScript の式です。式の周りの括弧はあってもなくてもかまいませんが、使用したほうが見た目はいいです。 void 演算子を使用することで式をハイパーテキストリンクとして指定することができます。式は評価されますが、開いている文書の代わりに読み込まれるということはありません。 以下のコードはユーザがクリックしても何も起こらないハイパーテキストリンクを作成します。ユーザがリンクをクリックすると void(0) は undefined に評価され、JavaScript としては影響を及ぼしません。 A HREF="javascript void(0)" Click here to do nothing /A 以下のコードはユーザがクリックするとフォームが送信されるハイパーテキストリンクを作成します。 A HREF="javascript void(document.form.submit())" Click here to submit /A
https://w.atwiki.jp/kokeiro/pages/89.html
ビット演算について 補足資料です。 ビット演算について 論理演算子について シフト演算子について typedefについて 型変換について sizeof演算子について 条件演算子について ビット演算 このページは、講義資料ではありません。講義では最低限覚えなければならないことを教えていますが、こちらで紹介する物は必ずしも覚えなくてもよい、しかし使えるとちょっと役に立つ機能を紹介します。マニア向け。 ビット演算は、整数型変数の各ビットに対して、論理演算やシフト演算などをします。ビット演算ができるのは符号付整数型、符号なし整数型のオペランドに対してのみであり、浮動小数点型などのオペランドには使えません。 コンピュータで使われる記憶素子は2通りの値をとります。それをn個並べることで、2n通りの情報を表現することができます。この記憶素子1個分の情報量をビット(bit)といいます。また、このビットをいくらかまとめた同次元の単位としてバイト(byte)があります。ビットとバイトの間の関係は、実際には定義されていませんが、多くのコンピュータでは1バイト=8ビットとして扱っています。このビットを使って数値を表現する方法として2進数があります。 C言語では、普通に数字列を書くと10進数として解釈されます。数字列の先頭に次の文字列を添えることで、次の基数で数値を表現することができます。 0b2進数 08進数 0x16進数 例えば、次のように使います。 #include stdio.h int main(int argc, char *argv[]){ int b = 0b10, o = 010, d = 10, x = 0x10; puts("\t%d\t%x"); printf("b\t%d\t%x\n", b, b);/* %d は整数型を符号付10進整数として、 %x は整数型を符号なし16進整数として文字列に変換します。 */ printf("o\t%d\t%x\n", o, o); printf("d\t%d\t%x\n", d, d); printf("x\t%d\t%x\n", x, x); return 0; } 結果 %d%x b22 o88 d10a x1610 論理演算子について 論理演算子は、整数型オペランドの各ビットに対して論理演算を行います。論理演算子は以下のものがあります。 a baとbの論理積 |a | baとbの論理和 ^a ^ baとbの排他的論理和 ~~aaの各ビットを反転 論理演算子も算術演算子と同様に次のような省略表現ができます。 a = a 演算子 b⇔a 演算子= b a = a b⇔a = b a = a | b⇔a |= b a = a ^ b⇔a ^= b サンプル #include stdio.h int main (int argc, char *argv[]){ unsigned int a = 0xc, b = 0xa;/* 0xc == 0b1100, 0xa == 0b1010 */ printf("0x%x 0x%x = 0x%x\n", a, b, a b);/* 0x8 == 0b1000 となる */ printf("0x%x | 0x%x = 0x%x\n", a, b, a | b);/* 0xe == 0b1110 となる */ printf("0x%x ^ 0x%x = 0x%x\n", a, b, a ^ b);/* 0x6 == 0b110 となる */ printf("~0x%x = 0x%x\n", a, ~a);/* 32ビット整数の場合、 0xfffffff3 == 0b111...11110101 となる */ return 0; } シフト演算子について シフト演算子は整数型のビットを左または右にずらします。ただし、データ型が符号ありか符号なしかで機能が変わるので注意が必要です。符号なし整数に対するシフトを論理シフト、符号あり整数に対するシフトを算術シフトといいます。シフト演算子は以下の通りです。 a naのビットを左へnビットシフト。右には0が詰められる。 a naのビットを右へnビットシフト。左には論理シフトなら0が、算術シフトなら正の場合0が、負の場合1が詰められる。 シフト演算子も算術演算子と同様に省略表現ができます。 a = a 演算子 b⇔a 演算子= b a = a n⇔a = n a = a n⇔a = n また、次の表の左と右は恒等的に等しいです。 a n = a×2n a n = a×2-n サンプル #include stdio.h int main(int argc, char *argv[]){ unsigned int a = 0x4, n = 2; printf("0x%x %u = 0x%x\n", a, n, a n); printf("0x%x %u = 0x%x\n", a, n, a n); return 0; } typedefについて ビット演算とは関係ありませんが、わざわざページを作ってまで紹介することでもないのでここで書きます。 typedefはデータ型に名前を付けます。それだけです。使い方は typedef データ型 新しい名前 とやります。変数の宣言と似ていますね。 #include stdio.h #include string.h typedef unsigned int uint;/* 長ったらしいデータ型を短くしたり (これは uint が新しいデータ型名) */ typedef __int64 integer_t;/* 将来データ型を変更するかもしれないものを一気に変えることができたり (integer_t が新データ型名) */ typedef struct person_st{ int no; char name[16]; }person_t;/* 構造体などにも名前を付けることができます。 (person_t が新データ型名) */ int main(int argc, char *argv[]){ uint n;/* unsigned int 型の変数 n を宣言。 */ integer_t i;/* __int64 型の変数 i を宣言。 (__int64 は処理系依存なので直接指定するよりは安全じゃないかな? かな?) */ person_t tarou;/* 構造体 person_st 型の変数 tarou を宣言。 */ n = 0; --n;/* アンダフローを起こす。 値としては UINT_MAX (limits.h で定義されている) となる。 */ printf("n = %u = 0x%x\n", n, n); i = (integer_t)1 40;/* 64 ビット符号あり整数なので最大 (2 の 63 乗) - 1 の整数を扱える。 (執筆当時 (2010 年現在) 、 CPU ビット幅の主流は 32 ビットから 64 ビットへ移行する境目の時期であった。) */ printf("i = %lld\n", i); tarou.no = 3; strncpy(tarou.name, "TAROU WORLD", 16); puts("No\tName"); printf("%d\t%s\n", tarou.no, tarou.name); return 0; } 結果 n = 4294967295 = 0xffffffff i = 1099511627776 NoName 3TAROU WORLD 型変換について 型変換とは、あるデータ型のオペランドを別のデータ型に変換することです。 特に明記しない場合でも、違うデータ型同士の演算や、違うデータ型の変数への代入などを行うことで、コンパイラが自動的に型変換を行うことがあります。これをWikipediaでは暗黙の型変換と呼んで明示的なものと区別しているようです。といっても、区別する目的でなければ、普段は型変換と呼んでいます。 型変換を明示的に行うこともできます。それを明示的型変換 (キャスト) といいます。これはよく使う言葉です。使い方は、 (変換先のデータ型) 変換されるオペランド とやります。 /* 暗黙の型変換だけテスト */ #include stdio.h int main(int argc, char *argv[]){ double realX; int intX; long long llX;/* 筆者の環境では 64 ビット符号あり整数 */ realX = 3.14159265358979323846e+3;/* ○.○○e□△△は○.○○×(10の□△△乗)を表わす。□は符号。 */ printf("realX = %.15g\n", realX); intX = realX;/* 整数型変数に浮動小数点型の値を入れることはできないので、浮動小数点型オペランドの少数第一以下を切捨てて整数型に変換してから代入される。 */ printf("intX = %d\n", intX); realX = intX;/* 浮動小数点型変数に整数型の値を入れることはできないので、整数型オペランドを指数形式で表し正規化して浮動小数点型に変換してから代入される。 */ printf("realX = %.15g\n\n", realX); llX = 12345678901234567;/* 16 桁の精度を持っている。 */ printf("llX = %lld\n", llX); realX = llX;/* double 型の精度は 15 桁なので丸め誤差が生じる。 */ printf("realX = %.15g\n", realX); llX = realX;/* 精度が下がったものを入れると… */ printf("llX = %lld\n", llX); return 0; } 結果 realX = 3141.59265358979 intX = 3141 realX = 3141 llX = 12345678901234567 realX = 1.23456789012346e+016 llX = 12345678901234568 次に明示的型変換を含んだサンプルを示します。 #include stdio.h int main(int argc, char *argv[]){ double x; int n; x = 9 / 2 * 2;/* 9 となるのが理想だが… */ printf("[1]\t9 / 2 * 2 = %g\n", x); x = (double)9 / 2 * 2;/* 最初の 9 を double 型に */ printf("[2]\t(double)9 / 2 * 2 = %g\n", x); x = 9 / (double)2 * 2;/* 真ん中の 2 を double 型に */ printf("[3]\t9 / (double)2 * 2 = %g\n", x); x = 9 / 2 * (double)2;/* 右端の 2 を double 型に */ printf("[4]\t9 / 2 * (double)2 = %g\n", x); x = (double)(9 / 2 * 2);/* 9/2 を double 型に */ printf("[5]\t(double)(9 / 2) * 2 = %g\n", x); x = 9. / 2. * 2.;/* 書式を変えただけだが… */ printf("[6]\t9. / 2. * 2. = %g\n", x); } 結果 [1]9 / 2 * 2 = 8 [2](double)9 / 2 * 2 = 9 [3]9 / (double)2 * 2 = 9 [4]9 / 2 * (double)2 = 8 [5](double)(9 / 2) * 2 = 8 [6]9. / 2. * 2. = 9 この結果の原因を考えます。この計算の計算の順番はいずれも、まず9を2で割り、その結果に2を掛けるというものです。違いはキャストを行うか行わないかです。ここで、9と2と2はいずれもint型のオペランドとして扱われます。オペレータはそのオペレータが演算する対象のすべてのオペランドの中で最も位の高いデータ型の演算規則で演算するため、その中で最も位の高いデータ型でないものを最も位の高いデータ型に暗黙の型変換します。ちなみに、データ型の順位は以下の通りです。 double float int char 本題に戻ります。/は2個のオペランドを受け取り、結果として1個のオペランド (型は演算したオペランドの中の最高位の型) を返します。*も2個のオペランドを受け取り、結果として1個のオペランドを返します。=は右側のオペランドを左側の変数に代入するため、データ型が異なれば右側のオペランドを強制的に変数のデータ型に暗黙の型変換します。 [1]ではまず9/2を演算しますが、最高位の型であるint型の演算規則で演算し、演算結果の4 (int型のオペランド) を返します。次に、計算結果の4と2を掛けます。なので、これはint型の8というオペランドを返します。残るオペレータは代入の=ですので、オペランド8をdouble型に型変換し、変数xに書き込みます。 [2]ではまずint型の9をdouble型にキャストします。次に9/2を演算しますが、最高位の型であるdouble型の演算規則で演算するため、2をdouble型に暗黙の型変換し、演算結果の4.5 (double型のオペランド) を返します。次に、演算結果の4.5と2を掛けます。なので、これはdouble型の9というオペランドを返します。残るオペレータは代入の=ですので、両方の型が等しいことから、そのまま右側のオペランドを変数xに書き込みます。 これだけ説明すれば[3]~[5]もわかるでしょう。わからなかったら掲示板でも使って「異議あり!」とか言ってください。 [6]は、数値オペランドの表現方法を変えただけですが、計算結果が[1]と違います。小数点を含むオペランドは浮動小数点型であると解釈されるので、9.や2.はdouble型のオペランドということになります。 sizeof演算子について sizeof演算子は、データ型やオペランドがメモリ上でどれだけの空間を占有しているのかをバイト単位で返す演算子です。1個のオペランドを受け取り、結果としてsize_t型のオペランドを返します。使い方は sizeof(データ型) sizeof(オペランド) sizeof データ型 sizeof オペランド とやります。()は任意ですが、付けた方が見た目が関数と似ててわかりやすいんじゃないかな? かな? #include stdio.h struct student_t{ char id[10]; char name[20]; }; int main(int argc, char *argv[]){ int n, arr[16]; char ch, *cp; printf("sizeof(double) = %u\n", sizeof(double)); printf("sizeof(float) = %u\n", sizeof(float)); printf("sizeof(struct student_t) = %u\n", sizeof(struct student_t)); printf("sizeof(n) = %u\n", sizeof(n)); printf("sizeof(arr) = %u\n", sizeof(arr)); printf("sizeof(arr[0]) = %u\n", sizeof(arr[0])); printf("sizeof(999) = %u\n", sizeof(999)); printf("sizeof(999.) = %u\n", sizeof(999.)); printf("sizeof( a ) = %u\n", sizeof( a )); printf("sizeof(\"ahya\") = %u\n", sizeof("ahya")); printf("sizeof(ch) = %u\n", sizeof(ch)); printf("sizeof( ch) = %u\n", sizeof( ch)); printf("sizeof(cp) = %u\n", sizeof(cp)); printf("sizeof(struct student_t *) = %u\n", sizeof(struct student_t *)); return 0; } 結果 sizeof(double) = 8 sizeof(float) = 4 sizeof(struct student_t) = 30 sizeof(n) = 4 sizeof(arr) = 64 sizeof(arr[0]) = 4 sizeof(19) = 4 sizeof(19.) = 8 sizeof( a ) = 4 sizeof("ahya") = 5 sizeof(ch) = 1 sizeof( ch) = 4 sizeof(cp) = 4 sizeof(struct student_t *) = 4 予想と結果はどんな感じでしたか? 私は a だけ予想外でした(予想では1かなと)。もちろんこの結果は処理系依存です。 条件演算子について 条件演算子は、式の中で使えるif文と思ってください。書式は 条件 ? 条件が真のときの式 条件が偽のときの式 となります。3個の項からなる演算子なので、条件演算子は三項演算子です。 サンプル #include stdio.h int main(int argc, char *argv[]){ int a, b, max, min; scanf("%d", a);// a の値を入力 scanf("%d", b);// b の値を入力 max = (a b) ? a b;// a と b のうち大きいほうを max に代入 min = (a b) ? a b;// a と b のうち小さいほうを min に代入 printf("大きいのは %d\n", a); printf("小さいのは %d\n", b); return 0; }
https://w.atwiki.jp/haishinti/pages/24.html
オペラ ★★☆(中級/3時間) 歴史的なオペラの政策背景や歴史を学ぶ講座。 また、話の流れを要約する。 オペラを見たことがないが、見てみたい人々におすすめできる。 興味のある回を聴講し、実際にオペラを聴きに行ってほしい。 『トスカ』 ★★☆ プッチーニ作曲のロマン派オペラ『トスカ』についての講義。 ナポレオン戦争を舞台とした悲劇の歴史的背景と話の要約を話す。
https://w.atwiki.jp/snesspec/pages/64.html
JMP (Jump to New Location) [ジャンプ] JMP 命令は、オペランドの値をプログラムカウンタ (PC) に書き込む (ジャンプ)。 ロングジャンプの時は、アドレスの値の 3 バイト目が プログラムバンクレジスタ (PBR) に書き込まれる。 JMP 命令は JSR と違い、プログラムカウンタ (PC) の値をスタックに積むことはせず、 直接指定されたアドレスにジャンプする。 他のレジスタも同様に、スタックに保存されることはない。 フラグ変化 -------- コード一覧 アドレッシングモード 文法 オペコード バイト数 命令サイクル 注 Absolute JMP addr 4C 3 3 Absolute Indirect JMP (addr) 6C 3 5 1 Absolute Indexed Indirect JMP (addr,X) 7C 3 6 Absolute Long JMP longAlias JML long 5C 4 4 Absolute Indirect Long JMP [addr]Alias JML [addr] DC 3 6 1 6502 オペランドの下位バイトが $FF の時 (オペランドが $xxFF) 不正な結果が得られる
https://w.atwiki.jp/mokasi/pages/47.html
レジェンド アイディアの上がる組み合わせ ラズベリーオペラ+サンマルク ラズベリーオペラ+カフェゼリー カフェゼリー+サンマルク このスイーツで覚えられるスイーツ =ザッハトルテ +フォンダン・ショコラ
https://w.atwiki.jp/keroro00innovator/pages/3619.html
オペラ オペラ アーティスト フェロ☆メン 発売日 2017年11月29日 レーベル 日本コロムビア デイリー最高順位 3位(2017年12月4日) 週間最高順位 5位(2017年12月5日) 月間最高順位 23位(2017年11月) 年間最高順位 144位(2017年) 初動売上 10337 累計売上 12657 収録内容 曲名 タイアップ 視聴 1 オペラ Dies irae ED 2 AnGeL fAlL ランキング 週 月日 順位 変動 週/月間枚数 累計枚数 1 12/5 5 新 10337 10337 2017年11月 23 新 10337 10337 2 12/12 17 ↓ 1669 12006 CD/総合ランキング 週 月日 CDシングル 総合シングル 順位 週/月間枚数 累計枚数 順位 週/月間枚数 累計枚数 3 12/19 426 12432 426 12432 4 12/26 225 12657 225 12657 2017年12月 45 2320 12657 2320 12657 関連CD 抱きよせてTONIGHT
https://w.atwiki.jp/akios/pages/56.html
4. 型と値と変数 4.1. 型と変数の種類 4.2. プリミティブ型と値 4.2.1. 整数型と値 4.2.2. 整数演算 Javaプログラミング言語は整数値に対する演算として以下を提供しています。 比較演算子はboolean型の値を返します。 数値比較演算子 と =と と = 数値等価演算子==と!= 数値演算子はint型もしくはlong型を返します。単項プラス演算子+、単項マイナス演算子- 乗法演算子*と/と% 加法演算子+と- インクリメント演算子、前置と後置の両方をサポート デクリメント演算子、前置と後置の両方をサポート 符号付きまたは符号なしシフト演算子 と と ビット単位補数演算子~ 整数ビット単位演算子 と^と| 条件演算子? キャスト演算子、整数値を指定された数値型の値に変換します 文字列結合演算子+、Stringオペランドと整数オペランドを与えると整数オペランドの値を表す10進数のString表現に変換し2つの文字列を結合して新たなString型を作成します 他にも便利なコンストラクターやメソッドや定数がByte、Short、Int、Long、Characterクラス内に定義されています。 シフト演算子以外の整数演算子で少なくとも一つのオペランドがlong型があれば、演算は64ビット精度で行われ、数値演算子の戻り値はlong型になります。他のオペランドがlong型でなければ、数値昇格によって最初にlong型に拡幅されます。 そうでなければ、演算は32ビット精度で行われ、数値演算子の戻り値はint型になります。オペランドがint型でなければ、数値昇格によって最初にint型に拡幅されます。 整数型の任意の値を任意の数値型へキャストしたり、任意の数値型の値からキャストして整数型の任意の値を得ることができます。boolean型と整数型の間はキャストできません。 整数式をbooleanに変換する方法は4.2.5.を参照してください。 整数演算子はいかなる形であれオーバーフローとアンダーフローを検出しません。 整数演算子は以下の場合において例外をスローします。 ヌル参照のボックス化解除変換が行われる場合、整数演算子はNullPointerExceptionをスローする。 除算演算子/および剰余演算子%で右オペランドがゼロの場合、ArithmeticExceptionをスローする。 インクリメント演算子++(15.14.2.、15.15.1.)とデクリメント演算子--(15.14.3.、15.15.2.)でボックス化変換が要求されたが実際に変換するのに必要なメモリーを確保できない場合、OutOfMemoryErrorをスローする。 例4.2.2-1. 整数演算 class Test { public static void main(String[] args) { int i = 1000000; System.out.println(i * i); long l = i; System.out.println(l * l); System.out.println(20296 / (l - i)); } } このプログラムは以下を出力します。 -727379968 1000000000000 そしてこの後に、l-iはゼロなので、l-iによる除算でArithmeticExceptionが発生します。1番目の乗算は32ビット精度で行われ、2番目の乗算は64ビット精度で行われます。値-727379968は計算結果である1000000000000(int型には大きすぎる値です)の下32ビットの10進値です。 4.2.3. 浮動小数点型と書式と値 4.2.4. 浮動小数点演算 4.2.5. ブール型とブール値 4.3. 参照型と値 4.4. 型変数 4.5. 引数付き型 4.6. 型の抹消 4.7. 具象可能型 4.8. 未加工型 4.9. 交差型 4.10. サブタイプ化 4.11. 型の使用箇所 4.12. 変数
https://w.atwiki.jp/snesspec/pages/71.html
PER (Push effective PC Relative Indirect Address) [PC相対間接アドレスの内容をプッシュ] この命令は、プログラムカウンタの値に 16 ビットのオペランドの値を足し、 結果の 16 ビットをスタックに積む。 結果のアドレスは、現在の 64KB バンクに収まっている必要がある。 プログラムカウンタの値は、 PER 命令とその 2 バイトのオペランドの 次 の命令のアドレスを指す。 上位バイトを最初にスタックに積み、 その後下位バイトをスタックに積む。 オペランドに相対アドレスを使うのは、 再配置可能なコードを書くことを補助するためである。 実行時アドレスが不明な場所を PER によってスタックに積み、 ポップする時に実行時の基底アドレスを決定する時に使うことができる。 6502 の時の、戻り先アドレスをスタックに入れるための、 pha → pha → rts というような書き方の代わりに使うこともできる。 フラグ変化 なし コード一覧 アドレッシングモード 文法 オペコード バイト数 命令サイクル Stack (PC Relative Long) PER label 62 3 6