最小可处理的,就是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);//或这样