CとCポインタ(8)-オペレータ、左、右

3393 ワード

1、シフトオペレータ
シフトオペレータは、左シフトオペレータ(<>)に分ける符号なし数:左右のシフト操作が論理シフトである符号数:論理シフトを採用するか算術シフトを採用するかはコンパイラに依存する.シンボル数を用いる右シフト操作が現れると、移植不可能である.
左シフト操作:右から空いたビット数を0で揃える.右シフト操作の場合:論理シフトの場合、左シフトのビットは0で埋め込まれます.算術シフトの場合、左の移入ビットは元の値の符号ビットによって決定する、符号が1であれば移入ビットはいずれも1、符号が0であれば移入ビットはいずれも0である.
注意:a<-5;このような形式のシフトはコンパイラによって決定する.その効果は予知できない.
2、ビットオペレータ
ビットオペレータは、それらの操作数の各ビットに対して、論理操作、または、異或、補等を実行する.含む:AND OR XOR、それぞれを表す、または、异或、(补)に対応するオペレータは:&|^~
3、ビット操作の応用
3.1入力文字の文字数、単語数、改行数を統計する
 /*
     *             ,   ,     ,    break,                          ,             ,        
     */
    int ch;
    int lines = 0;
    int words = 0;
    int chars = 0;
    while ((ch = getchar()) != EOF) {
        switch (ch) {
            case '
': lines += 1; case ' ': case '\t': words += 1; default: chars += 1; } }

3.2整数のある桁数を1にする
 // value1        1
    int value1 = 5;
    printf("value1: %d ",value1);//5 b0101
    value1 = value1 | 1 << 5;// value1        1
    printf("value1: %d
",value1);//37 b10101

3.3数のある桁数を0にする
    // value2   5    0
     int value2 = 32;
    printf("value2: %d ", value2);//32 b10000
    value2 = value2 & ~( 1 << 5);
    printf("value2: %d
", value2);//0 b00000

3.4整数のバイナリ・シーケンスのあるビットが1であるかどうかをテストする
    //   4    1
    int value3 = 15;
    printf("value3: %d
", value3);//15 printf("value3 4 %d
",(value3 & 1 << 4));//value3 4 0

3.5関数パラメータ値の1のビット数を返す
//          1     
int count_one_bits(unsigned value) {
    int ones;
    for(ones = 0; value != 0; value >>= 1){
        if ((value & 1) != 0) {
            ones += 1;
        }
    }
    return ones;
}


4、割り当てオペレータ=
注意すべき点:a=x=y+3;xが文字型変数である場合、y+3の値は、文字型との変数を収容するためにセグメント化される.では、aが与える値は切り取られた値である.前にも述べたようにchar ch;while((ch = getchar()) !=EOF)EOFに必要なビット数が文字型値よりも多くなるため、getcharは文字値ではなく整数値を返す.しかしながら、getchar()の戻り値をchと先に記憶すると遮断される.そして、この切断する値は、ビット整形され、EFOと比較する.このエラーのあるコードは、シンボル文字セットを使用するマシン上で実行すると、値ビット377のバイトが読み込まれるとループが終了する.この値を短くしてさらに上げるとEOFと等しいためである.このコードが符号なし文字セットを使用するマシン上で実行されると、このループは永遠に終了しません.
さらに、複合賦値子もあり、プログラムが簡潔になる+=-=*=/=%=<=>=&=^=|=
5、単一オペレータ
!++ - & sizeof~--+*(タイプ)
! 論理逆操作~補完操作を求める-オペランドを生成する負の値+オペランドを生成する値は、何もしない&オペランドを生成するアドレス*プロフィールアクセスに等しく、ポインタとともに使用する、ポインタが指す値sizeofにアクセスしてオペランドのタイプ長を判断し、バイトを単一ビットとする.オペランドは、式(しばしば単一の変数)であるもよく、両側に括弧を付けるタイプ名であってもよい.例えば、sizeof(int)sizeof x.sizeof(a=b+1)は、aに値を与える.()強制タイプ変換(cast)は、式を明示的に別のタイプに変換するために使用されます.++--この2つの式には接頭辞と接尾辞の形式がある.一般に、割り当てオペレータとともに使用する.
6、下付き
Array[n]は*(array+(n))に等価である.
. および->は、構造のメンバーにアクセスするために使用されます.sが構造変数である場合、s.aはsのaというメンバーにアクセスする.構造自体ではなく構造体を指すポインタを持ち、メンバーにアクセスするには->オペレータを使用する必要があります.オペレータ
##7、左値と右値の左値は、付与記号の左側に現れるものであり、右値は、付与記号の右側に現れるものである.左の値は変数である、式であってもよい.しかし、多くの居住式は左の値とすることができる.式が左の値である場合、その意味は特定のメモリ位置である必要がある.例:a=b+1;//aは左の値ですがb+1=a;//b+1は左値として使用できません.int a[30].a[b + 10] = 0;//ここで式はint a,piのような左の値です.pi = &a;pi = 20;//ここでpは間接取値式としてpiが指定する修正が必要な位置を表す左値である.int c = pi;//ここで*pの意味は、現在記憶するこの位置との値を抽出することである.
転載先:https://www.cnblogs.com/wjw-blog/p/10384086.html