有人可以用非常简单的术语解释为什么我们需要按位运算符吗?我刚刚开始编程一个月前。
我知道一切都以二进制形式存储。我理解计算机在基数2中计数。我理解按位运算符。我只是不明白使用位和按位运算符需要什么样的编程?
我试图在网上寻找答案,并且我读了二进制标志和残疾的事情,并且更加困惑。
我想我只是想知道,什么样的现实应用程序需要位和位运算符?
答案 0 :(得分:1)
您可以以非常简洁的格式打包数据。
x86计算机可以添加的最小数量是一个字节 - 即8位。
如果你的应用程序有24个是/否标志(bool),你会将它们存储在每个1个字节中吗?这是24个字节的数据。如果你使用位,那么每个字节包含8个bool - 所以你只需要3个字节就可以得到24个是/否值:
> 1 Byte per flag:
> 0000 0000 = off
> 0000 0001 = on
> Easy to check: if(b == 0) { /* flag is off */ } else if(b == 1) { /* flag is on */ }
> 1 Bit per flag
> 0011 1101 = Flags 1, 4, 8, 16 and 32 are on, flags 2, 64 and 128 are off
> Packs 8 flags in 1 byte
> Harder to check:
> if( (b & 32) != 0) { /* Flag 32 is on */ }
这对于网络协议和其他每个字节都很重要的系统非常重要。
对于通用业务应用程序,通常不需要额外的复杂性,每个标志只使用1个字节。
这不仅仅用于布尔。例如,某些应用程序可能希望存储两个数字而不是0-15的数字 - 例如Commodore 64,它确实需要尽可能地节省RAM。一个字节可以容纳其中两个数字:
> Instead of interpreting this as 8 bits (ranging from 1 to 128)
> this is really two 4 bit numbers:
> 1001 0110
> First Number: 1001 = 1 + 8 = 9
> Second Number: 0110 = 2 + 4 = 6
>
> Getting the first number requires a bit shift to move them into position:
> (b >> 4) turns the above number into this:
> 0000 1001 - this can now be simply cast as a byte and returns 9
>
> The second number requires us to "turn off" the first 4 bits
> We use the AND operator for this: b = (b & 15)
> 15 in decimal is 0000 1111 in binary.
>
> 1001 0110 AND
> 0000 1111 =
> 0000 0110
>
> Once again, the result can be interpreted as a byte and results in the number 6
另一个非常巧妙的技巧是快速检查数字是偶数还是奇数。奇数始终具有最低有效位(1位)设置,而偶数数字总是清晰。
所以你对IsEven的检查看起来像这样:
return (b & 1) == 0; // Bit 1 not set - number is even
(注意:根据语言的不同,编译器可能决定优化内容,但简而言之,就是这样)
答案 1 :(得分:1)
使用二进制标志存储状态允许您在一个变量中有许多“活动标志”,并且通过按位访问它我们可以检查每个位置的二进制值。如果你知道它的存储方式,你也可以使用它来访问数字的特定部分,here's来自处理的一个例子。
我在现实生活中使用它来解决存储状态最好的状态。就像熟练掌握不同种类的魔法一样:)
Skills:
None (0)
Conjuration (1)
Evocation (2)
Illusion (4)
Necromancy (8)
Alteration (16)
现在我可以在一个字段中存储魔法向导的能力。如果巫师技能总计达到13,我们知道他知道:咒语,幻觉和死灵法术。所有这些都可以使用按位运算轻松访问。利用我们对bits和base-2的了解,我们可以使用数字中的每个位作为布尔标志,通常用于存储某种相关状态(如选项或魔术熟练度,在C#中FlagsAttribute非常有用。
答案 2 :(得分:0)
嗯......有很多实例可以使用按位运算符。这是一个。 linux系统调用采用文件路径名和位掩码,指定文件的访问模式作为参数。示例:打开(" somefile",O_RDWR | O_CREAT | O_TRUNC | S_IWUSR),打开(" somefile",O_RDONLY)。按位或操作允许我们在单个参数中指定大量信息,因此简化了与内核的接口。