什么时候在web开发中使用按位运算符?
尽pipe我把握了位运算符的概念,但是我不能说在我不得不求助于使用位运算符的web开发过程中遇到了很多用例。
- 你使用位运算符?
- 你为什么要用它们?
- 什么是一些示例用例?
请记住,这个问题专门用于网页语言的位运算符。
对于按位运算符,我的主要用途可能与任何地方有关 – 代表一组标志。 例如,您可能在数据库中有一个整数代表一组用户的安全权限,在您的Web应用程序中,您必须在继续之前检查这些权限。
那些往往只需要&
和|
– 例如
if ((permissions & Permission.CreateUser) != 0) { ... }
要么
Permission requiredPermission = Permission.CreateUser | Permission.ChangePassword;
根据我的经验, 移位操作符在“业务”应用程序中用处不大。
我将在这里更加明确,因为我认为位掩码是一个伟大的工具,应该在任何开发者带。 我将尝试扩展上面的答案。 首先,使用一个整数来维护状态标志的一个例子(常见用法):
// These are my masks private static final int MASK_DID_HOMEWORK = 0x0001; private static final int MASK_ATE_DINNER = 0x0002; private static final int MASK_SLEPT_WELL = 0x0004; // This is my current state private int m_nCurState;
要设置我的状态,我使用按位或运算符:
// Set state for'ate dinner' and 'slept well' to 'on' m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);
注意我如何“或”我目前的状态与我想打开的状态。 谁知道我目前的状态是什么,我不想把它吹走。
为了解除我的状态,我使用了与运算符的补码运算符:
// Turn off the 'ate dinner' flag m_nCurState = (m_nCurState & ~MASK_ATE_DINNER);
要检查我目前的状态,我使用AND运算符:
// Check if I did my homework if (0 != (m_nCurState & MASK_DID_HOMEWORK)) { // yep } else { // nope... }
为什么我觉得这很有趣? 说我正在devise一个界面,设置我的状态。 我可以写一个接受三个布尔值的方法:
void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);
或者,我可以用一个数字来表示所有三个状态并传递一个值:
void setState( int nStateBits);
如果你select第二种模式,当决定添加另一个状态时,你会非常高兴 – 你不必打破现有的界面impls。
我的两分钱 谢谢。
对于Java程序员来说,异或运算符(^)提供了一种有用的方法来编写两个布尔值之间的异或testing。 例:
boolean isFoo = ... boolean isBar = ... if (isFoo ^ isBar) { // Either isFoo is true or isBar is true, but not both.
注意:这里没有实际的位操作,但是这是使用xor按位运算符(在web层或其他任何地方)的有用方法。
(这同样适用于C#,因为它与Java非常相似,不过不确定。
除了标志之外,在脚本语言中使用位操作没有太大的理由。 但是一旦你深入到你的堆栈中,位操作变得越来越重要。
这个问题已经回答了,但是我想和大家分享我的经验。
当我在做一个ASP.NET C#练习时,我已经使用&
不久之前validation了一个registry单,在这个练习中短路的&&
不会轻易达到预期的效果。
我想要做的是突出显示窗体中的所有无效字段,并在每个无效字段旁边显示一条错误消息标签,并重新设置所有有效字段并从中删除错误消息。
我使用的代码是这样的:
protected void btnSubmitClicked(...) { username = txtUsername.Text; email = txtEmail.Text; pass = txtPassword.Text; if (isUsernameValid(username) & isEmailValid(email) & isPasswordValid(pass)) { // form is valid } else { // form is invalid } ... } private bool isPasswordValid(string password) { bool valid = true; string msg = ""; if (password.length < MIN_PASSWORD_SIZE) { valid = false; msg = "Password must be at least " + MIN_PASSWORD_SIZE + " long."; } highlightField(txtPassword, lblPassword, valid, msg); return valid; } private void highlightField(WebControl field, Label label, string valid, string msg) { if (isValid) { // de-highlight field.BorderColor = VALID_FIELD_COLOR; } else { // highlight the text field and focus on it field.BorderColor = INVALID_FIELD_COLOR; field.Focus(); } label.Text = msg; } // and other similar functions for username and email
如果我使用&&
而不是&
,则btnSubmitClicked
方法中的if语句只会突出显示第一个无效字段,之后的所有其他无效字段将不会突出显示,并且不会显示其错误消息,因为短路&&
会停止在遇到错误之后检查条件。
可能有更好的方法来实现同样的事情,但我发现&
有用的时间。
一般来说,您不需要关注位级别的操作。 您可以用字节,整数,双精度和其他更高级别的数据types来思考。 但有些时候,你想能够达到个人的水平。
按位运算符最常见的使用情况之一是标志 (php示例)。 按位运算符也用于二进制文件IO操作。
我经常使用它们,但从来没有在我可以避开它们的地方。 我经常使用的是以下两种情况。
- 在不通过安全连接的情况下,使用JavaScript对来自客户端的表单数据进行encryption,但并不比发送纯文本要好。
- stream式传输PHP中生成的文件结构(通常是一些二进制文件types)。
在事物的离题方面,在高级语言中,特别是在parsing语言(比如PHP)中,按位运算比正常运算要慢得多。 所以,从性能的angular度来看,Jon的权限检查可能是不错的,但是在networking域名中并不是非常“原生”的。
我唯一不得不在授权访问之外使用它们的是我为一个parsing器所做的项目,该parsing器将颜色ID分配给了整数
即
$color_red= 1; $color_blue = 2; $color_yellow = 8; $color_purple = 3; $color_orange = 9; $color_green = 10;
然后给我一个财产
$can_collect_200_dollars = 10;
然后按位比较给出的属性的颜色
if($given_color & $can_collect_200_dollars) { $yay_i_got_200_dollars = true; }else{ $bummer_i_am_going_to_jail = true; }
我认为如果聪明地使用,那么按位运算符是非常强的。
假设你有一个“在线商店”。 而你的一些物品落在更多的类别。
要么你必须创build一个多对多的关系。 或者您可以给您的类别一个额外的二进制ID,并在您的产品中存储类别ID的按位组合
我觉得我不能详细解释。 抱歉