标签: bit-manipulation

创建 32 位位掩码的最有效方法

我想创建一个掩码来设置第一个nnybbles的位,以及m这些 nybbles的第一个位, wheren <=8m <=4 .

高效,我的意思是一种最小化按位运算的方法。

目前我使用蛮力方法:首先创建一个 nybble 掩码,然后继续左移掩码并将这些数字组合在一起。

这是我目前的方法:

#define NIBBLE   ((unsigned int)0xF >> m))
#define MASK     ((NIBBLE | (NIBBLE << 4) |  (NIBBLE << (8)) | (NIBBLE << (12)) | (NIBBLE << (16)) | (NIBBLE << (20)) | (NIBBLE << (24)) | (NIBBLE << (28)))  >> (n*4) )
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation bitwise-operators

0
推荐指数
1
解决办法
930
查看次数

C++ 含义 |= 和 &amp;=

我有一部分代码包含以下功能:

void Keyboard(int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState |= TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState |= TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState |= TDC_UP; break;
    case GLFW_KEY_S: m_controlState |= TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}

void KeyboardUp( int key)
{
    switch (key) {
    case GLFW_KEY_A: m_controlState &= ~TDC_LEFT; break;
    case GLFW_KEY_D: m_controlState &= ~TDC_RIGHT; break;
    case GLFW_KEY_W: m_controlState &= ~TDC_UP; break;
    case GLFW_KEY_S: m_controlState &= ~TDC_DOWN; break;
    default: Test::Keyboard(key);
    }
}
Run Code Online (Sandbox Code Playgroud)

我知道开关盒是什么,但我不明白这些部件的作用。

m_controlState |= TDC_LEFT
m_controlState &= ~TDC_LEFT
Run Code Online (Sandbox Code Playgroud)

m_controlState …

c++ bit-manipulation bitwise-operators box2d

0
推荐指数
2
解决办法
8601
查看次数

仅使用按位运算符复制 for 循环的功能

我正在尝试仅使用按位和某些运算符(包括 ! ~ & ^ | + << >>

int loop(int x) {
   for (int i = 1; i < 32; i += 2)
     if ((x & (1 << i)) == 0)
       return 0;
   return 1; 
}
Run Code Online (Sandbox Code Playgroud)

但是,我不确定如何仅使用这些运算符来复制循环的累积性质。我明白移位<< >>会让我乘以除以。然而,操作使用! ~ & ^ ~已被证明更加困难。有小费吗?

http://www.tutorialspoint.com/cprogramming/c_operators.htm

编辑:我了解如何添加位,但不知道如何在不先调用 while 或 for 循环的情况下实现这样的输出。

c c++ for-loop bit-manipulation bitwise-operators

0
推荐指数
1
解决办法
2462
查看次数

使用 Erlang 的按位 bnot 运算符进行位操作

阅读Hacker's Delight 的第 2 章并尝试在 Erlang 中实现位操作。

我被困在这个问题上:

使用以下公式创建一个单词,在 x 中尾随 1 的位置处为 0,其他位置为 1,如果没有则生成全为 1(例如 10100111 => 11111000):

          ¬ x | (x + 1)
Run Code Online (Sandbox Code Playgroud)

这是我尝试过的:

(bnot X) bor (X + 2#01)
Run Code Online (Sandbox Code Playgroud)

但结果是-1000出于某种原因,而不是2#11111000

奇怪的not 2#10100111-10101000(基数为 2)。

知道发生了什么吗?

erlang bit-manipulation

0
推荐指数
1
解决办法
513
查看次数

为什么 2 ** (1 &lt;&lt; 31) == 0?

在节点 REPL 中运行它,给我:

> 2 ** (1 << 31)
0

Run Code Online (Sandbox Code Playgroud)

我还为此编写了一个小算法,它给了我 1。

> 2 ** (1 << 31)
0

Run Code Online (Sandbox Code Playgroud)

问题:

  1. 为什么 REPL 0 中的实际答案是?
  2. 我上面的算法有什么问题吗?

javascript algorithm bit-manipulation

0
推荐指数
1
解决办法
82
查看次数

将有符号 32 位存储在无符号 64 位 int 中

基本上,我想要的是在(最右边的 32 位)一个无符号的 64 位 int 中“存储”一个有符号的 32 位 int - 因为我想将最左边的 32 位用于其他目的。

我现在正在做的是一个简单的演员和面具:

#define packInt32(X) ((uint64_t)X | INT_MASK)
Run Code Online (Sandbox Code Playgroud)

但是这种方法有一个明显的问题:如果X是一个正整数(第一位没有设置),一切都会好起来的。如果它是负数,它就会变得一团糟。


问题是:

如何以最快和最有效的方式实现上述目标,同时支持负数?

c bit-manipulation int32

0
推荐指数
2
解决办法
516
查看次数

如何在一个 int (C#) 中唯一存储 4 个 int?

假设我有以下四个整数:

int a = 4;
int b = 5;
int c = 6;
int d = 7;
Run Code Online (Sandbox Code Playgroud)

我想将这些值存储在一个 int 中:

int whole;
Run Code Online (Sandbox Code Playgroud)

我将如何使用按位/移位操作来做到这一点?我试过:

int whole = a + (b << 8) + (c << 16) + (d << 24);
Run Code Online (Sandbox Code Playgroud)

但我不确定这是否会为整体创建唯一值,因为我也想从整体中检索整数。因此,例如,如果我有整个 = 5919835,我想取回 c 的值。

.net c# bit-manipulation bit

0
推荐指数
1
解决办法
156
查看次数

测试是否设置了所有高位

给定一个只有一位设置 (n) 的 uint16,我想测试 bit_rank 是否设置了所有更重要的位。我目前正在使用 for 循环,但我确信只有几个运算符会有点巧妙。此代码使用编译器,其中位操作产生 32 位 int。

uint16_t b; // loop variable
uint16_t n; // one and only one bit set
uint16_t bit_rank; // contains n and possibly higher/lower bits than n
for (b = n << 1; b < 0x10000; b <<= 1)
    if (b & bit_rank)
        continue;
    else
        break;
if (b == 0x10000)
    printf("all bits from n to 0x8000 are set");
Run Code Online (Sandbox Code Playgroud)

c bit-manipulation

0
推荐指数
1
解决办法
109
查看次数

优化的可被整除

假设我有数字 X,我想看看它是否可以被 Y 整除。最优化的方法是什么?

到目前为止,我有:

int X = 12;
int Y = 4;
(X ^ Y) & 0b111 ==0    # Check if X XOR Y (mask size Y) == 0
Run Code Online (Sandbox Code Playgroud)

虽然我是硬编码0b111(Y 的掩码大小)。顺便说一句,我不关心语言,我只是用 C 标记它。


顺便说一句,使用编译器资源管理器我得到:

int is_divisible_by(int x, int y) {
    return x % y == 0;
};
Run Code Online (Sandbox Code Playgroud)
# -O3
is_divisible_by:
        movl    %edi, %eax
        cltd
        idivl   %esi         # seems to just be doing straight division?
        xorl    %eax, %eax
        testl   %edx, %edx
        sete    %al
        ret
Run Code Online (Sandbox Code Playgroud)

c optimization x86 assembly bit-manipulation

0
推荐指数
1
解决办法
118
查看次数

如何在没有移位/旋转的情况下在 GPR 的特定位设置进位标志?

我正在为 Intel 80386 处理器在 NASM 中编写程序,我需要在 GPR(通用寄存器)的特定位中设置进位标志的值,而不更改寄存器中的其他位。

是否有可能在不使用任何类型的移位/旋转的情况下这样做?

x86 assembly bit-manipulation carryflag eflags

0
推荐指数
1
解决办法
75
查看次数