37用d编程位操作

最小可处理的,就是8位,
writefln("%s is %s byte(s)", bool.stringof, bool.sizeof);
所以bool实际上是一个字节.而不是1位.计算机一次至少读一个字节.
寄存器:32位的4字节大小.64位的8字节大小.

import std.stdio;

void main() {
    //1073741824                     4 1
    int number = 0b_01000000_00000000_00000000_00000101;//32位
    writeln(number);
    int number = 0b_10000000_00000000_00000000_00000000;
//最前的1.
    writeln(number);
    uint number = 0b_10000000_00000000_00000000_00000000;
//正数
    writeln(number);
    uint number = 0x_0030_a00f;
    writeln(number);
}

位操作,最好都是数.

import std.stdio;

void print(uint number) {
    writefln("  %032b %08x %10s", number, number, number);
}

void main() {
    print(123456789);
}

~表示数.每个位都翻转了.& | ^(异或).A ^A==0(清0).
>>,<<,>>>(正右移)
>>:最右边的丢掉了.对数,最左边的用0填充.
整类型.有个符号扩展.如果为负数,则最左边为1(负).符号扩展右移时保持正负号.

    uint value = 123456789;

    print(value ^ value);

    uint value = 123456789;
    print(value);
    print(value >> 2);

    int value = 0x80010300;
    print(value);
    print(value >> 3);

    int value = 0x40010300;
    print(value);
    print(value >> 3);

    int value = 0x80010300;
    print(value);
    print(value >>> 3);//正右移,最左边始终为0

不管表达式类型和最左边的值的位.正右移,始终用0填充.

    uint value = 123456789;
    print(value);
    print(value << 4);//左移

赋值操作符:&=, |=, ^=, >>=, >>>=, 和 <<=.
|有1,则为1.&有0,则为0
右移1位,除以2. 左移1位,乘以2.
位运算可用来设置标志.

enum Realism {
    fuelUse    = 1 << 0,
    bodyDamage = 1 << 1,
    tireUse    = 1 << 2,
    skidMarks  = 1 << 3
}
    Realism flags = Realism.tireUse | Realism.skidMarks;
    writefln("%b", flags);
//查询
 if (flags & Realism.fuelUse) {
        //燃料代码
    }

    if (flags & Realism.tireUse) {
        // 轮胎代码
    }
...

掩码.

uint value = 123456789;
    uint mask  = 0x000000ff;
//或
   uint mask  = 0xff000000;

    write("value :"); print(value);
    write("mask  :"); print(mask);
    write("result:"); print(value & mask);
 print((value & mask) >> 24);//或这样

发布了440 篇原创文章 · 获赞 29 · 访问量 11万+

猜你喜欢

转载自blog.csdn.net/fqbqrr/article/details/104588739