A,B和C是某些无符号整数类型的变量.从概念上讲,A是测试向量,B是"必需"位的位掩码(必须设置A中的至少一个对应位),并且C是"禁止"位的位掩码(可以不设置A中的相应位).因为我们正在混合按位和逻辑运算符,否则看起来很自然的解决方案
A & B & ~C
Run Code Online (Sandbox Code Playgroud)
是不正确的.相反,标题表达式等同于伪代码
((a0 & b0) | ... | (an & bn)) & (~(a0 & c0) & ... & ~(an & cn))
Run Code Online (Sandbox Code Playgroud)
其中a0
,等等表示各个位(并且n
是最高位的索引).我没有看到如何有效地重新排列这个并提取相应的代码但是,有没有一种聪明的方法,也许有^
,简化标题中的表达式?
编辑:提示@ huseyintugrulbuyukisik的问题我注意到我们可以假设(B & C) == 0
,但我不知道这是否有帮助.
编辑2:结果:这取决于分支预测的好坏!
#include <chrono>
#include <cmath>
#include <iostream>
#include <vector>
using UINT = unsigned int;
int main(void)
{
const auto one = UINT(1);
const UINT B = (one << 9); // Version 1
// const UINT B = (one …
Run Code Online (Sandbox Code Playgroud) 如何计算按位AND是 的幂的数组中无序对的数量2
。例如,如果数组是[10,7,2,8,3]
. 答案是6
。说明(基于 0 的索引):
a[0]&a[1] = 2
a[0]&a[2] = 2
a[0]&a[3] = 8
a[0]&a[4] = 2
a[1]&a[2] = 2
a[2]&a[4] = 2
我想到的唯一方法是蛮力。如何优化它以在O(n)或O(n*log(n)) 中执行?
对数组大小的限制可以是 max 10^5
。并且该数组中的值可以高达10^12
。
这是我尝试过的蛮力代码。
int ans = 0;
for (int i = 0; i < a.length; i++) {
for (int j = i + 1; j < a.length; j++) {
long and = a[i] & a[j];
if ((and & (and …
Run Code Online (Sandbox Code Playgroud) 我想找到一种方法来执行SQL查询,该查询将计算存储在数据库中的子网掩码的cidr(位表示).例如,我有255.255.255.0或其十进制值(4294967040)存储在数据库中.我想通过查询进行选择并返回/ 24表示.
我做了以下的事情来确定子网的最后一个IP,所以我希望做类似的事情来确定一个掩码的cidr表示.
select concat(inet_ntoa(ip_addr),'-',
inet_ntoa(ip_addr+(POWER(2,32)-ip_mask-1))) range
from subnets
order by ip_addr
Run Code Online (Sandbox Code Playgroud)
最好这是一个可以在mysql,postgres,oracle等下工作的SQL语句.
使用int vs varbinary在性能或灵活性方面存储位掩码是否有任何优势.
出于我的目的,我将始终对这些位掩码进行读取(无写入或更新).
我希望将JavaScript编号的MIN_SAFE_INTEGER
通过MAX_SAFE_INTEGER
范围(不包括符号的53位)转换为分布在7个字节的位串,移位2以允许符号和空标识符.
到目前为止,我提出的最好的是:
function toUint8Array(data) {
data = data.toString(2);
data = new Array(65 - data.length).join('0') + data;
var ret = new Uint8Array(data.length / 8);
for (var i = 0; i < 8; i++) {
ret[i] = 0;
ret[i] += (data[i * 8] == '1' ? 128 : 0);
ret[i] += (data[(i * 8) + 1] == '1' ? 64 : 0);
ret[i] += (data[(i * 8) + 2] == '1' ? 32 : 0);
ret[i] += (data[(i …
Run Code Online (Sandbox Code Playgroud) 我试图存储在运行时确定的大量布尔信息.我想知道最好的方法是什么.
我目前一直在尝试使用以下方式分配内存:
pStatus = malloc((<number of data points>/8) + 1);
认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:
pStatus[element]
不幸的是,这似乎并不是很好.首先,我很难将内存初始化为整数值0
.这可以用memset()
吗?尽管如此,我认为这不会影响我尝试访问时崩溃的原因pStatus[element]
.
我也不完全相信这种方法是最好的方法.我真正想要的本质上是一个反映布尔值状态的巨型位掩码.我错过了什么吗?
CI会这样做
int number = 3510;
char upper = number >> 8;
char lower = number && 8;
SendByte(上部);
SendByte(低级);
上下都是= 54
在C#我这样做:
Run Code Online (Sandbox Code Playgroud)int number = Convert.ToInt16("3510"); byte upper = byte(number >> 8); byte lower = byte(number & 8); char upperc = Convert.ToChar(upper); char lowerc = Convert.ToChar(lower); data = "GETDM" + upperc + lowerc; comport.Write(data);
但是在调试器编号= 3510,upper = 13和lower = 0这没有任何意义,如果我将代码更改为>> 6 upper = 54这绝对是奇怪的.
基本上我只想从16位数字中获取上下字节,并在"GETDM"之后将其发送到com端口
我怎样才能做到这一点?它在C语言中非常简单,但在C#中我完全被难倒了.
鉴于枚举:
[Flags]
enum foo
{
a = 1,
b = 2,
c = 4
}
Run Code Online (Sandbox Code Playgroud)
然后
foo example = a | b;
Run Code Online (Sandbox Code Playgroud)
如果我不知道foo是否包含c
,我以前写过以下内容
if (example & foo.c == foo.c)
example = example ^ foo.c;
Run Code Online (Sandbox Code Playgroud)
有没有办法做到这一点,不检查是否存在等foo.c
的example
?
当谈到添加时,我可以做一个OR
,如果枚举值已经存在,example
那么它并不重要.
我知道~0将评估最大字大小的位1(因此需要关注可移植性),但我仍然没有得到为什么((1 << N) - 1)不鼓励?
如果您使用了第二张表格,请分享并遇到任何麻烦.
我有这些可能的位标志.
1, 2, 4, 8, 16, 64, 128, 256, 512, 2048, 4096, 16384, 32768, 65536
Run Code Online (Sandbox Code Playgroud)
所以每个数字都像服务器端的真/假语句.因此,如果前3个项目,并且只有前3个项目在服务器端标记为"true",则Web服务将返回7.或者,如果以上所有14个项目都为真,我仍然会从网络服务是所有这些数字的总和.
处理我回来找出哪些项目被标记为"真实"的最佳方法是什么?