問題タブ [bit-shift]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c# - C#でシフト演算子<<>>を使用する場合
私はC#でシフト演算子を研究していて、コードでそれらをいつ使用するかを見つけようとしていました。
答えは見つかりましたが、Javaの場合は次のことができます。
a)整数の乗算と除算の演算を高速化します。
* 4839534 * 4 *は次のように実行できます: 4839534 << 2
また
543894/2は次のように実行できます:543894 >> 1
ほとんどのプロセッサでは、乗算よりもはるかに高速に演算をシフトします。
b)バイトストリームをint値に再アセンブルする
c)赤、緑、青の色は別々のバイトでコード化されているため、グラフィックスを使用して操作を高速化するため。
d)小さな数を1つの長いものに詰める...
b、c、dについては、ここで実際のサンプルを想像することはできません。
これらすべての項目をC#で実行できるかどうか誰かが知っていますか?C#のシフト演算子のより実用的な使用法はありますか?
java - >>> と >> 演算子の違い
シフトされた数値が正の場合、>>> と >> は同じように機能します。
シフトされた数値が負の場合、>>> は最上位ビットを 1 で埋めますが、>> 操作は MSB を 0 で埋めます。
私の理解は正しいですか?
負の数が MSB を 1 に設定して格納され、Java が使用する 2 の補数の方法ではなく、演算子の動作がまったく異なる場合、正しいでしょうか?
bit-shift - Maximaでビットシフト演算を使用して方程式を解く
Maximaを使用して評価したい複雑な方程式がいくつかあります。
ソリューションプロセスの1つのステップで、レジスタを最も重要なコンポーネントと最も重要でないコンポーネントに分割しました。そのため、Maximaでそれを実行できる必要があります。
使ってみましたload(functs)
、ありがとうございます。
java - Javaビットシフトストレンジネス
Javaには、右シフト用の2つのビットシフト演算子があります。
http://java.sun.com/docs/books/tutorial/java/nutsandbolts/op3.html
これはかなり単純なように思われるので、このコードがbarに-128の値を与えられたときに、fooに-2の値を生成する理由を誰かが私に説明できますか?
これが意味することは、8ビットバイト、左端の2ビットのマスクを取り、それらを右端の2ビットにシフトすることです。すなわち:
結果は実際には-2であり、これは
つまり。ゼロではなく1が左の位置にシフトされます
java - ビットごとのシフト演算子。署名ありおよび署名なし
インターネットの学習ノートを使って SCJP 試験の練習をしています。
私のメモによると、>>
演算子は符号付き右シフトで、符号ビットは左から取り込まれます。左シフト演算子<<
は符号ビットを保持することになっていますが。
ただし、いじってみると、<<
演算子で符号をシフトできます (feInteger.MAX_VALUE << 1
は に評価されます-2
が、演算子で符号をシフトすることはできません>>
。
ここで何か誤解しているに違いありませんが、何ですか?
php - 2 つの異なるマシンで 2 つの答えを与える PHP 左シフト
PHP の左シフト関数の動作について非常に混乱しています。私は2つの異なるマシン(開発とホスティング)でそれを使用していますが、彼らは私に異なる答えを与えています. 私はこの計算にそれを追跡しました:
(-3941404251) << 5;
あるマシンでは、答えは -1570884448 です。どちらのシステムでも、PHP_INT_MAX = 2147483647 です。後者は 32 ビット システムで、最初のシステムは 64 ビットですが、php は 32 ビット プロセスとして実行されており、同じ答えが得られます。
これは 32 ビットと 64 ビットの問題だとしか思えませんが、目的の動作を実現する簡単な方法はありますか。誰かが私に関数か何かを教えてくれたら、それは素晴らしいことです.
ありがとう!
java - C#/Java のような高級言語がビット シフト カウント オペランドをマスクする理由は何ですか?
これは、プログラミングの問題ではなく、言語設計の問題です。
以下は、 JLS 15.19 Shift Operatorsからの抜粋です。
左側のオペランドの昇格された型が の場合、
int
右側のオペランドの下位 5 ビットのみがシフト距離として使用されます。左側のオペランドの昇格された型が の場合、
long
右側のオペランドの下位 6 ビットのみがシフト距離として使用されます。
この動作はC# でも指定されており、Javascript の公式仕様 (存在する場合) に含まれているかどうかはわかりませんが、少なくとも私自身のテストに基づいても当てはまります。
その結果、次のことが成り立ちます。
この仕様は、基盤となるハードウェアが 32 ビット値をシフトするときにカウント オペランドに 5 ビット (および 64 ビットの場合は 6 ビット) しか使用しないという事実におそらく「触発された」ものであることを理解しています。たとえば、JVM レベルですが、C# や Java などの高レベル言語がこの低レベルの動作を維持するのはなぜでしょうか? ハードウェアの実装を超えた抽象的なビューを提供し、より直感的に動作するべきではないでしょうか? (他の方向にシフトすることを意味する負の数を取ることができればさらに良いです!)
c# - C# のビット シフト: この動作は仕様、バグ、または偶然ですか?
私はビット シフト演算子を使用していました (私の質問Bit Array Equalityを参照してください)。SO ユーザーが私のシフト オペランドの計算のバグを指摘しました。[0,31] ではなく [1,32] の範囲を計算していました。 int の場合。(SO コミュニティに万歳!)
問題を修正する際に、次の動作を見つけて驚きました。
実際、それはbs(n) = n のサイズ (ビット単位n << s
) としてコンパイルされている (または CLR によって解釈されている - 私は IL をチェックしていませんでした)ように見えます。n << s % bs(n)
私は期待していたでしょう:
コンパイラは、ターゲットのサイズを超えてシフトしていることに気づき、間違いを修正しているようです。
これは純粋に学術的な質問ですが、これが仕様で定義されているかどうか (私は7.8 Shift operatorで何も見つかりませんでした)、未定義の動作の偶然の事実であるかどうか、またはこれがバグを生成する可能性がある場合があるかどうかは誰にもわかりませんか?
algorithm - 分岐ステートメントをビット シフト演算に置き換える
各ピクセルの輝度値 (グレースケール画像) を単純に黒または白に変換する画像二値化アルゴリズムを作成しています。現在、各ピクセルを 2 値化するためのアルゴリズムは、おおよそ次のとおりです。
(これは実際には ACTUAL アルゴリズムの簡略化です。これは、モノクロ イメージが実際にはビットパックされたイメージであるため (各配列インデックスは 8 ピクセルを保持するため)、現在の配列インデックス内の 1 を実際にビットパックする...しかし、それによって私の質問。
私がやろうとしているのは、if ステートメントの必要性を取り除くことです。
私が考えていたのは、これに沿って何かをすることでした。グレースケールでしきい値値を減算し、ビット操作のトリッキーを実行してビットをクリアまたはシフトします(grayscale[x]-threshold) is less than 0, I get a 0. otherwise I would get a 1
。逆のほうが簡単な場合は、それ(if grayscale[x]-threshold < 0 + bitwise trickery get a 1, else get a 0)
も機能します...分岐ステートメントを取り除くことができる限り...どんな助けも感謝します..
c# - 一部のインシデントでのみ算術シフトが半分になるのはなぜですか?
ねえ、私はビット単位について独学で学んでいて、インターネットのどこかで算術シフト(>>)が半分の数であるのを見ました。私はそれをテストしたかった:
もう一つの例:
ありがとう。