标签: bitmask

简化(A&B)&&!(A&C)

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)

c++ bit-manipulation bitmask bit

12
推荐指数
1
解决办法
2211
查看次数

计算按位“与”是 O(n) 或 O(n*log(n)) 中 2 的幂的数组中无序对的数量

如何计算按位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)

algorithm bit-manipulation bitmask data-structures

12
推荐指数
1
解决办法
4402
查看次数

使用SQL确定子网掩码的cidr值

我想找到一种方法来执行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语句.

sql bitmask subnet cidr

11
推荐指数
1
解决办法
1万
查看次数

SQL Server:varbinary或int来存储位掩码?

使用int vs varbinary在性能或灵活性方面存储位掩码是否有任何优势.

出于我的目的,我将始终对这些位掩码进行读取(无写入或更新).

sql sql-server database-design bitmask

11
推荐指数
2
解决办法
1万
查看次数

在JavaScript中将整数转换为任意排序的字节数组的最快方法?

我希望将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)

javascript numbers bitmask

11
推荐指数
2
解决办法
296
查看次数

我可以在C中分配特定的位数吗?

我试图存储在运行时确定的大量布尔信息.我想知道最好的方法是什么.

我目前一直在尝试使用以下方式分配内存:

pStatus = malloc((<number of data points>/8) + 1);

认为这会给我足够的工作量.然后我可以使用数组表示法中的指针引用每个布尔值:

pStatus[element]

不幸的是,这似乎并不是很好.首先,我很难将内存初始化为整数值0.这可以用memset()吗?尽管如此,我认为这不会影响我尝试访问时崩溃的原因pStatus[element].

我也不完全相信这种方法是最好的方法.我真正想要的本质上是一个反映布尔值状态的巨型位掩码.我错过了什么吗?

c malloc bitmask

10
推荐指数
3
解决办法
1万
查看次数

在C#中获取整数的上下字节并将其作为char数组发送到com端口,如何?

CI会这样做

int number = 3510;

char upper = number >> 8;

char lower = number && 8;

SendByte(上部);

SendByte(低级);

上下都是= 54

在C#我这样做:

            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);
Run Code Online (Sandbox Code Playgroud)

但是在调试器编号= 3510,upper = 13和lower = 0这没有任何意义,如果我将代码更改为>> 6 upper = 54这绝对是奇怪的.

基本上我只想从16位数字中获取上下字节,并在"GETDM"之后将其发送到com端口

我怎样才能做到这一点?它在C语言中非常简单,但在C#中我完全被难倒了.

c# bytearray bitmask bit-shift char

10
推荐指数
2
解决办法
4万
查看次数

按位减法

鉴于枚举:

[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.cexample

当谈到添加时,我可以做一个OR,如果枚举值已经存在,example那么它并不重要.

c# bit-manipulation bitmask

10
推荐指数
2
解决办法
5946
查看次数

关于C中的比特掩蔽.为什么(〜(~0 << N))优先于((1 << N)-1)?

我知道~0将评估最大字大小的位1(因此需要关注可移植性),但我仍然没有得到为什么((1 << N) - 1)不鼓励?

如果您使用了第二张表格,请分享并遇到任何麻烦.

c bitmask

10
推荐指数
1
解决办法
1623
查看次数

提取位标志的最有效方法

我有这些可能的位标志.

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个项目都为真,我仍然会从网络服务是所有这些数字的总和.

处理我回来找出哪些项目被标记为"真实"的最佳方法是什么?

php bitmap bitmask

9
推荐指数
3
解决办法
5916
查看次数