虽然我掌握了Bitwise Operators的概念,但我不能说在Web开发过程中我遇到了很多用例,我不得不求助于使用Bitwise Operators.
你使用Bitwise运算符吗?
你为什么用它们?
什么是一些示例用例?
请记住,此问题专门用于在Web语言中使用Bitwise Operators.
我将在这里更明确,因为我认为按位掩码是一个伟大的工具,应该在任何开发带.我将尝试扩展上面的答案.首先,使用整数来维护状态标志的示例(常见用法):
// 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;
要设置我的状态,我使用按位OR运算符:
// Set state for'ate dinner' and 'slept well' to 'on' m_nCurState = m_nCurState | (MASK_ATE_DINNER | MASK_SLEPT_WELL);
注意我'或'我目前处于与我想要打开的状态的状态.谁知道我现在的状态是什么,我不想把它吹走.
要取消设置状态,我使用带有补码运算符的按位AND运算符:
// 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... }
为什么我认为这很有趣?假设我正在设计一个设置我的状态的界面.我可以写一个接受三个布尔值的方法:
void setState( boolean bDidHomework, boolean bAteDinner, boolean bSleptWell);
或者,我可以使用单个数字来表示所有三个状态并传递单个值:
void setState( int nStateBits);
如果您选择第二种模式,那么在决定添加另一种状态时您会非常高兴 - 您不必破坏现有的界面.
我的两分钱.谢谢.
我对位运算符的主要用途可能是任何地方都相关 - 表示一组标志.例如,您可能在数据库中有一个整数,表示用户的一组安全权限,在您的Web应用程序中,您必须在继续之前检查这些权限.
那些往往只需要&
和|
- 例如
if ((permissions & Permission.CreateUser) != 0) { ... }
要么
Permission requiredPermission = Permission.CreateUser | Permission.ChangePassword;
位转移运营商都在我的经验,"企业"应用程序的那么有用.
对于Java程序员,xor位运算符(^)提供了一种有用的方法来编写两个布尔值之间的异或测试.例:
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#练习时,短路&&
不能轻易达到预期的效果.
我想要做的是突出显示表单中的所有无效字段,并在每个无效字段旁边显示错误消息标签,并取消所有有效字段的高亮显示并从中删除错误消息.
我用它的代码是这样的:
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
如果我使用&&
而不是&
,方法中的if语句btnSubmitClicked
将仅突出显示第一个无效字段,之后的所有其他无效字段将不会突出显示并且其错误消息未显示,因为短路&&
将停止检查条件之后遇到错误.
可能有更好的方法来实现同样的目标,但我觉得&
当时很有用.