这就是我所做的:
93 | 199
Run Code Online (Sandbox Code Playgroud)
返回
223
Run Code Online (Sandbox Code Playgroud)
我理解,这是因为0b1011101 | 0b11000111是0b11011111
但是,假设我想进行反向操作.如何0b1011101从0b11000111和之间的按位操作中获得0b11011111?
一段时间以来,我一直在努力处理一些低级别的消息,结果证明校验和计算存在问题.我认为按位XOR运算符不关心符号,所以我使用a QByteArray来存储字节,并使用at返回a 的方法char来计算校验和.这些消息有时被正确承认,但并非总是如此.
看起来另一端的人uint8_t用来存储字节,并且校验和在某些情况下失败了.我通过铸造char来解决它uint8_t,但我对此感到困惑.
为什么按位XOR运算符关心符号?不管他们代表什么,我认为它在某种程度上有效.这是我用来试图理解它的一段代码.
#include <stdio.h>
#include <stdint.h>
#include <iostream>
#include <bitset>
int main ()
{
uint8_t a = 0b10010101;
char b = 0b10010101;
uint32_t checksum;
checksum = 55;
checksum ^= a;
std::cout << std::bitset<32>(checksum) << std::endl;
checksum = 55;
checksum ^= b;
std::cout << std::bitset<32>(checksum) << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
即使两个整数都保持相同的位,操作在每种情况下产生不同的结果.
有时在编程中,它们允许将参数链接到单个函数输入变量中,例如下面的第二个输入变量:
define('FLAGA',40);
define('FLAGB',10);
define('FLAGC',3);
function foo($sFile, $vFlags) {
// do something
}
foo('test.txt',FLAGA | FLAGB | FLAGC);
Run Code Online (Sandbox Code Playgroud)
PHP 将此单个管道字符(|)称为按位OR运算符。我现在如何在里面添加一些东西foo()来测试$vFlags以查看设置了哪些标志?
php bit-manipulation bitwise-operators input-parameters bitwise-or
如何在我的自定义FeatureAuthorize属性中使用按位OR运算传递多个参数,同样AttributeUsage支持AttributeTarget方法或类.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
Run Code Online (Sandbox Code Playgroud)
以下是我想要实现的示例,提供的任何功能,无论是发送钱还是收款方法都应该是可访问的.
[FeatureAuthorize(Feature = EnumFeature.SendMoney | EnumFeature.ReceiveMoney)]
public ActionResult SendOrReceiveMoney(int? id, EnumBankAccountType? type)
{
// My code
}
Run Code Online (Sandbox Code Playgroud)
FeatureAuthorize属性的主体就像.
[AttributeUsage(AttributeTargets.Class | AttributeTargets.Method)]
public class FeatureAuthorizeAttribute : AuthorizeAttribute
{
public EnumFeature Feature { get; set; }
public override void OnAuthorization(AuthorizationContext filterContext)
{
if (!IsFeatureAllowed(Feature)) // Verification in database.
{
// Redirection to not authorize page.
}
}
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
我试图在c#中检查SharePoint用户的权限,我遇到了以下似乎有效的代码:
isGranted = spweb.DoesUserHavePermissions(userlogin, SPBasePermissions.EmptyMask | SPBasePermissions.ViewPages);
Run Code Online (Sandbox Code Playgroud)
第一个参数是用户检查权限.第二个参数是检查用户是否拥有的权限.
我的问题是,bitmask或在emptymask和viewpages权限之间的结果是什么?这实际上是在检查什么权限?
我最近在一次采访中被问到这个问题,我完全错了,但让我对C#和.net中的编译器优化感到好奇
请考虑以下代码段:
void Main()
{
Console.WriteLine("Results when bitwise or is used: ");
Console.WriteLine(FuncA() | FuncB());
Console.WriteLine("Results when or operator is used: ");
Console.WriteLine(FuncA() || FuncB());
}
bool FuncA()
{
Console.WriteLine("Function A is executing.");
return true;
}
bool FuncB()
{
Console.WriteLine("Function B is executing.");
return false;
}
Run Code Online (Sandbox Code Playgroud)
运行上面的结果会得到以下结果:
按位或使用时的结果:
功能A正在执行.
功能B正在执行.
真正
使用或运算符时的结果:
功能A正在执行.
真正
我的问题是为什么在使用按位运算符时编译器没有优化?就像C#或运算符一样,编译器已经知道了这些参数,那么为什么它不会以相同的方式处理它呢?
因此,我向一位高级开发人员寻求帮助,以解决与事务范围相关的问题,他来到我的办公桌前,在 SqlBulkCopy 上使用了不同的重载,对于 SqlBulkCopyOptions 参数,他做了如下所示的操作:
SqlBulkCopyOptions options = (SqlBulkCopyOptions.FireTriggers | SqlBulkCopyOptions.CheckConstraints);
Run Code Online (Sandbox Code Playgroud)
它现在有效,但我不明白bitwise or这里的意思。我以为我对它有一些了解,从来没有真正使用过它,但是这个用法让我摸不着头脑。是的,我没有要求我的前辈向我解释它。我希望有人能帮助我理解该声明的含义。网上的大多数按位或示例都带有一些数字,我得到了(我认为),但是这个?
是否有一种算法可以在线性时间复杂度中找到按位或和或数组?
假设如果数组是 {1,2,3},那么所有对和 id 1|2 + 2|3 + 1|3 = 9。
我可以使用以下算法在 O(n) 中找到所有对 AND 总和......我如何更改它以获得所有对 OR 总和。
int ans = 0; // Initialize result
// Traverse over all bits
for (int i = 0; i < 32; i++)
{
// Count number of elements with i'th bit set
int k = 0; // Initialize the count
for (int j = 0; j < n; j++)
if ( (arr[j] & (1 << i)) )
k++;
// There are k set …Run Code Online (Sandbox Code Playgroud) 我试图将char中的所有位设置为true.
char foo = 00000000;
foo |= 11111111;
for (int i = 0; i < 8; i++) { //prints out bitwise
printf("%d", !!((foo << i) & 0x80));
}
Run Code Online (Sandbox Code Playgroud)
当foo全为0时,我得到11000111.当foo == 00000110时,它打印11001111; 这里出了什么问题?
GCC 在编译下面的代码时出错。注释的两行而不是其他或和移位线有效,但我不确定铸造是否必要且真实。
错误是这样的:二进制操作数无效| (有“char*”和“int”)
谢谢。
void bits2byte(int *bits, char *byte) {
byte = 0;
int i;
for (i = 0; i<8; i++) {
if (bits[i] == 1) {
byte = byte | 0x01;
// byte = (char*)((int)byte | 0x01);
}
if (i<7) {
byte = byte << 0x01;
// byte = (char*)((int)byte << 0x01);
}
}
}
int main() {
int input_bits[] = {1, 1, 0, 1, 0, 0, 1, 1};
char output_byte;
bits2byte(input_bits, &output_byte); …Run Code Online (Sandbox Code Playgroud) bitwise-or ×10
c# ×4
c ×2
.net ×1
asp.net-mvc ×1
bit ×1
bit-shift ×1
c++ ×1
enums ×1
optimization ×1
php ×1
python ×1
sqlbulkcopy ×1