标签: bit-manipulation

python中'和'(布尔)与'&'(按位)之间的区别.为什么列表与numpy数组的行为存在差异?

是什么解释了列表与numpy.arrays上布尔运算和按位运算的行为差异?

我对在python中正确使用' &'vs' and' 感到困惑,如下面的简单示例所示.

mylist1 = [True,  True,  True, False,  True]
mylist2 = [False, True, False,  True, False]

>>> len(mylist1) == len(mylist2)
True

# ---- Example 1 ----
>>> mylist1 and mylist2
[False, True, False, True, False]
# I would have expected [False, True, False, False, False]

# ---- Example 2 ----
>>> mylist1 & mylist2
TypeError: unsupported operand type(s) for &: 'list' and 'list'
# Why not just like example 1?

>>> import numpy as np …
Run Code Online (Sandbox Code Playgroud)

python bit-manipulation numpy boolean-expression ampersand

124
推荐指数
5
解决办法
8万
查看次数

我应该使用#define,enum还是const?

在我正在研究的C++项目中,我有一个标志值,它可以有四个值.这四个标志可以组合在一起.标志描述数据库中的记录,可以是:

  • 新纪录
  • 删除记录
  • 修改记录
  • 现有记录

现在,对于我希望保留此属性的每条记录,我可以使用枚举:

enum { xNew, xDeleted, xModified, xExisting }
Run Code Online (Sandbox Code Playgroud)

但是,在代码的其他地方,我需要选择哪些记录对用户可见,所以我希望能够将其作为单个参数传递,如:

showRecords(xNew | xDeleted);
Run Code Online (Sandbox Code Playgroud)

所以,似乎我有三个可能的附件:

#define X_NEW      0x01
#define X_DELETED  0x02
#define X_MODIFIED 0x04
#define X_EXISTING 0x08
Run Code Online (Sandbox Code Playgroud)

要么

typedef enum { xNew = 1, xDeleted, xModified = 4, xExisting = 8 } RecordType;
Run Code Online (Sandbox Code Playgroud)

要么

namespace RecordType {
    static const uint8 xNew = 1;
    static const uint8 xDeleted = 2;
    static const uint8 xModified = 4;
    static const uint8 xExisting = 8;
}
Run Code Online (Sandbox Code Playgroud)

空间要求很重要(字节与整数),但并不重要.使用定义我失去了类型安全性,并且enum我失去了一些空间(整数),并且当我想要进行按位操作时可能需要进行转换.随着 …

c++ enums bit-manipulation c-preprocessor

123
推荐指数
6
解决办法
6万
查看次数

120
推荐指数
7
解决办法
22万
查看次数

如何在C++中编写可维护,快速,编译时的位掩码?

我有一些或多或少像这样的代码:

#include <bitset>

enum Flags { A = 1, B = 2, C = 3, D = 5,
             E = 8, F = 13, G = 21, H,
             I, J, K, L, M, N, O };

void apply_known_mask(std::bitset<64> &bits) {
    const Flags important_bits[] = { B, D, E, H, K, M, L, O };
    std::remove_reference<decltype(bits)>::type mask{};
    for (const auto& bit : important_bits) {
        mask.set(bit);
    }

    bits &= mask;
}
Run Code Online (Sandbox Code Playgroud)

Clang> = 3.6做聪明的事情并将其编译为单个and指令(然后在其他地方内联):

apply_known_mask(std::bitset<64ul>&):  # @apply_known_mask(std::bitset<64ul>&)
        and     qword …
Run Code Online (Sandbox Code Playgroud)

c++ bit-manipulation c++11

113
推荐指数
5
解决办法
7963
查看次数

在C中以整数查找最高设置位(msb)的最快/最有效方法是什么?

如果我有一个整数n,并且我想知道最高位的位置(也就是说,如果最低有效位在右边,我想知道最左边位的位置是1),找出最快捷/最有效的方法是什么?

我知道POSIX支持ffs()strings.h中的一个方法来查找第一个设置位,但似乎没有相应的fls()方法.

是否有一些非常明显的方法可以解决这个问题?

如果你不能使用POSIX功能来实现可移植性呢?

编辑:如何在32位和64位架构上运行的解决方案(许多代码清单似乎只能在32位整数上运行).

c algorithm optimization bit-manipulation

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

设置的最低有效位的位置

我正在寻找一种有效的方法来确定在整数中设置的最低有效位的位置,例如对于0x0FF0,它将是4.

这是一个简单的实现:

unsigned GetLowestBitPos(unsigned value)
{
   assert(value != 0); // handled separately

   unsigned pos = 0;
   while (!(value & 1))
   {
      value >>= 1;
      ++pos;
   }
   return pos;
}
Run Code Online (Sandbox Code Playgroud)

任何想法如何挤出一些周期?

(注意:这个问题适合喜欢这类事情的人,而不是人们告诉我xyzoptimization是邪恶的.)

[编辑] 感谢大家的想法!我也学到了其他一些东西.凉!

c c++ optimization bit-manipulation

111
推荐指数
10
解决办法
7万
查看次数

在C/C++中,什么是反转字节中位的顺序的最简单方法?

虽然有多种方法可以在一个字节中反转位顺序,但我很好奇开发人员实现的"最简单".通过颠倒我的意思是:

1110 -> 0111
0010 -> 0100
Run Code Online (Sandbox Code Playgroud)

这与 PHP问题类似,但不重复.

这与 C问题类似,但不重复.这个问题要求开发人员实施最简单的方法."最佳算法"涉及内存和CPU性能.

c c++ bit-manipulation

101
推荐指数
13
解决办法
14万
查看次数

C/C++检查是否设置了一个位,即int变量

int temp = 0x5E; // in binary 0b1011110.
Run Code Online (Sandbox Code Playgroud)

有没有这种方法可以检查temp中的第3位是1还是0而没有位移和屏蔽.

只是想知道是否有一些内置功能,或者我自己不得不写一个.

c c++ bit-manipulation

98
推荐指数
9
解决办法
25万
查看次数

如何从C中的整数值获取逐位数据?

我想提取十进制数的位.

例如,7是二进制0111,我想得到0 1 1 1存储在bool中的所有位.我怎么能这样做?

好的,循环不是一个好选择,我可以为此做点什么吗?

c bit-manipulation

95
推荐指数
3
解决办法
16万
查看次数

按位运算和使用

考虑以下代码:

x = 1        # 0001
x << 2       # Shift left 2 bits: 0100
# Result: 4

x | 2        # Bitwise OR: 0011
# Result: 3

x & 1        # Bitwise AND: 0001
# Result: 1
Run Code Online (Sandbox Code Playgroud)

我可以理解Python(和其他语言)中的算术运算符,但我从来没有完全理解'按位'运算符.在上面的例子中(来自Python书),我理解左移但不是其他两个.

另外,实际使用的是按位运算符?我很欣赏一些例子.

python binary bit-manipulation operators

94
推荐指数
7
解决办法
14万
查看次数