标签: bit-manipulation

对 16 位信号 (Python) 运算符进行按位补码 ^

小问题,我正在尝试对 16 位长的信号进行按位求补(NOT)。在Python文档中,我天真地认为执行以下操作会起作用:

~ x
Run Code Online (Sandbox Code Playgroud)

令我惊讶的是,这会返回负数。我在聊天中询问,他们告诉我使用:

x ^ 65535
Run Code Online (Sandbox Code Playgroud)

我仍然不明白的是为什么会这样。

为什么这有效?

python bit-manipulation

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

立即获取整数中最左边有效位的索引

如何从左到右而不是从右到左扫描整数(二进制)?我知道我可以从左边开始尝试每一位,然后记录最左边的位,但是有没有更快的方法?是否有一个内置函数可以立即找到整数中最左边的有效位(即 1)?

我知道从右到左,我可以做类似的事情

int myInt = 1234;
for(int i = 0; i < 32; i++) {
  int curr_bit = myInt & (1 << i);
  // do something with curr_bit
}
Run Code Online (Sandbox Code Playgroud)

但是,我想从最左边的可用位开始,并且我想要它的数字“x”,以便它1 << x指向该确切的数字(正如旁注,我正在尝试实现重复平方,并且我需要在我的代码)。

任何帮助将不胜感激!

c++ bit-manipulation built-in bit findfirst

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

基于 BitMask 在数组中设置值的本质

是否有一个内在函数可以在输入数组中的所有位置设置单个值,其中相应位置在提供的 BitMask 中具有 1 位?

10101010 是位掩码

值为 121

它将设置位置 0,2,4,6 值为 121

c x86 bit-manipulation intel intrinsics

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

如何在C中将16位值拆分为两个8位值

我不知道这个问题是否正确,但是。

例如,十进制为25441,二进制为110001101100001。我如何将它分成两个8位“1100011”和“01100001”(即“99”和“97”)。然而,我只能想到使用位操作将其移动>>8,而我无法对“97”执行其余操作。这是我的功能,这不是一个好的功能,但我希望它有所帮助:

void reversecode(int input[], char result[]) {  //input is 25441
int i;
for (i = 0; i < 1; i++) {  
    result[i] = input[i] >> 8;                  // shift by 8 bit
    printf("%i", result[i]);                    //to print result
}
}
Run Code Online (Sandbox Code Playgroud)

我正在考虑使用 struct 但我不知道如何启动它。我是 C 语言的初学者,很抱歉我的糟糕风格。谢谢你之前。

c binary bit-manipulation

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

编译器如何识别字节移位运算符的长度

考虑以下行:

int mask = 1 << shift_amount;

我们知道这mask是 4 个字节,因为它是明确声明的int,但是1要移动的这个长度未知。如果编译器选择 type 为char8 位,或者它的unsigned short大小可能为16 位,那么移位结果实际上将取决于编译器关于如何处理它的决定的大小1。编译器在这里如何决定?以这种方式保留代码是否安全,或者应该改为:

int flag = 1;

int mask = flag << shift_amount;

c c++ bit-manipulation bit-shift

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

为什么 (52 &amp; (1 &lt;&lt; 37)) 不返回 0?

我正在尝试制作一个给定整数的算法,吐出其二进制形式的字符串表示形式。

现在,我基本上是在比较一个掩码以查看在哪里添加 1/0 位。这工作正常,直到出现稍大的数字,例如:(52 & (1 << 37))如果我正确理解位移运算符(显然我没有)应该返回 0,因为(1 << 37)=1和 37 * 0。现在我上次检查,52二进制格式的十进制第38位没有1 ,那么为什么返回32?

java bit-manipulation

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

如何使用整数索引获取 64 位 unsigned long 的 16 位部分?

我正在尝试从 64 位 unsigned long 返回某些 16 位部分,但我一直在思考如何实现这一点。这是我试图实现的功能:

// assume i is a valid index (0-3 inclusive)
unsigned short get(unsigned long* ex, int i) {
  // return the 16-bit section based on the index i
}
Run Code Online (Sandbox Code Playgroud)

例如,如果我有unsigned long ex = 0xFEDCBA9876543210;,那么我的函数get(ex, 0)将返回0x3210get(ex, 1)将返回0x7654,等等。我对 C 非常陌生,我仍在尝试围绕位管理和指针。感谢任何建议或反馈,以帮助我更好地理解 C。

c indexing pointers bit-manipulation

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

在 C++ 中使用 uint64_t 的上半部分的指令/内在?

想象以下代码:

在线试试吧!

uint64_t x = 0x81C6E3292A71F955ULL;
uint32_t y = (uint32_t) (x >> 32);
Run Code Online (Sandbox Code Playgroud)

y接收 64 位整数的较高 32 位部分。我的问题是是否存在任何内在函数或任何 CPU 指令可以在不进行移动和移位的情况下在单个操作中执行此操作?

至少铛(在上面挂尝试,它-在线)创建两个指令mov rax, rdi,并shr rax, 32对于这一点,所以无论是铛不会做这样的优化,或不存在这样的特殊指令。

如果存在像movhi dst_reg, src_reg.

c c++ bit-manipulation instructions intrinsics

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

( | vs. || ) C++ 中的“OR”运算符比较

我知道在 C/C++ 中,这||是正常的 OR 比较运算符,也|就是按位 OR 运算符。
我的问题是,为什么我们对同一件事有 2 个不同的运营商?为什么我们不在|任何地方使用?


例子:

int n = 1;
if (n == 1 | n == 2) { cout << "Condition Matched\n"; }
Run Code Online (Sandbox Code Playgroud)

截屏

这也有效,因为|运算符两侧的条件,即:(n == 1)(n == 2)无论如何都被评估为布尔值/单位值。我错过了什么吗?

c++ bit-manipulation

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

C++中涉及按位运算的表达式的值是多少

在我的机器上,以下表达式:-

int main()
{
    int q = 0b01110001;
    cout << q << endl;
    cout << (~q << 6);
}
Run Code Online (Sandbox Code Playgroud)

打印以下内容:-

113
-7296
Run Code Online (Sandbox Code Playgroud)

我试过假设 16 位整数来解决它,但我的答案与按位运算后获得的值不匹配。

这仅仅是未定义行为的情况还是我在这里遗漏了什么?

c++ bit-manipulation bit-shift

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