小问题,我正在尝试对 16 位长的信号进行按位求补(NOT)。在Python文档中,我天真地认为执行以下操作会起作用:
~ x
Run Code Online (Sandbox Code Playgroud)
令我惊讶的是,这会返回负数。我在聊天中询问,他们告诉我使用:
x ^ 65535
Run Code Online (Sandbox Code Playgroud)
我仍然不明白的是为什么会这样。
为什么这有效?
如何从左到右而不是从右到左扫描整数(二进制)?我知道我可以从左边开始尝试每一位,然后记录最左边的位,但是有没有更快的方法?是否有一个内置函数可以立即找到整数中最左边的有效位(即 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指向该确切的数字(正如旁注,我正在尝试实现重复平方,并且我需要在我的代码)。
任何帮助将不胜感激!
是否有一个内在函数可以在输入数组中的所有位置设置单个值,其中相应位置在提供的 BitMask 中具有 1 位?
10101010 是位掩码
值为 121
它将设置位置 0,2,4,6 值为 121
我不知道这个问题是否正确,但是。
例如,十进制为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 语言的初学者,很抱歉我的糟糕风格。谢谢你之前。
考虑以下行:
int mask = 1 << shift_amount;
我们知道这mask是 4 个字节,因为它是明确声明的int,但是1要移动的这个长度未知。如果编译器选择 type 为char8 位,或者它的unsigned short大小可能为16 位,那么移位结果实际上将取决于编译器关于如何处理它的决定的大小1。编译器在这里如何决定?以这种方式保留代码是否安全,或者应该改为:
int flag = 1;
int mask = flag << shift_amount;
我正在尝试制作一个给定整数的算法,吐出其二进制形式的字符串表示形式。
现在,我基本上是在比较一个掩码以查看在哪里添加 1/0 位。这工作正常,直到出现稍大的数字,例如:(52 & (1 << 37))如果我正确理解位移运算符(显然我没有)应该返回 0,因为(1 << 37)=1和 37 * 0。现在我上次检查,52二进制格式的十进制第38位没有1 ,那么为什么返回32?
我正在尝试从 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)将返回0x3210,get(ex, 1)将返回0x7654,等等。我对 C 非常陌生,我仍在尝试围绕位管理和指针。感谢任何建议或反馈,以帮助我更好地理解 C。
想象以下代码:
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++ 中,这||是正常的 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)无论如何都被评估为布尔值/单位值。我错过了什么吗?
在我的机器上,以下表达式:-
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 位整数来解决它,但我的答案与按位运算后获得的值不匹配。
这仅仅是未定义行为的情况还是我在这里遗漏了什么?