我有一个关于在ADD/SUB和分支方面实现XOR的面试问题:在两个数字之间实现Xor操作仅使用以下命令:
您可以使用寄存器r3和r4作为额外空间.假设寄存器r1存储第一个数字,r2存储第二个数字
我有一个功能,int8_t val将其转换为int7_t.
//Bit [7] reserved
//Bits [6:0] = signed -64 to +63 offset value
// user who calls this function will use it correctly (-64 to +63)
uint8_t func_int7_t(int8_t val){
uint8_t val_6 = val & 0b01111111;
if (val & 0x80)
val_6 |= 0x40;
//...
//do stuff...
return val_6;
}
Run Code Online (Sandbox Code Playgroud)
操作int8到int7 的最佳和最快方法是什么?我有效率和快速地做到了吗?还是有更好的方法?
如果重要的话,目标是ARM Cortex M0 +
更新:
在阅读了不同的答案后,我可以说这个问题被错误了?(或者我在问题中的代码是对其他人做出错误假设的原因)我有意向int7做int8
所以它将通过无所事事来完成,因为
8位:
63 = 0011 1111
62 = 0011 1110
0 = 0000 0000
-1 = 1111 …Run Code Online (Sandbox Code Playgroud) 我在接受采访时被要求使用按位运算符交换整数中的最后一位和第一位数.尝试了很多,但我找不到解决方案.我怎样才能做到这一点?
这就是问题:
仅使用C(&和<=)中的两个操作,最多5个操作,确定字符是字母小写还是大写.您可以根据需要声明尽可能多的变量,但是您只能进行5位按位和(&)以及<=比较操作.
例:
is_char('b') = 1
is_char('A') = 1
is_char(10) = 0
Run Code Online (Sandbox Code Playgroud)
我可以在6个操作中完成它,但不能在5个中完成....任何人都有想法?
抱歉!!忘了包括没有人可以使用控制流语句:/
给定数字'n'和相应的二进制值.我想只使用'n'中设置的位来生成n的所有组合.
例如:如果n = 11且其二进制表示为1011,则组合为:
0000
0001
0010
0011
1000
1001
1010
1011
Run Code Online (Sandbox Code Playgroud)
例2:如果n = 49且其二进制表示为11001,则组合为:
00000
00001
01000
01001
10000
10001
11000
11001
Run Code Online (Sandbox Code Playgroud)
最简单的方法可能是编写一个C子程序来生成这些组合,但是,我需要一些有效的方法/算法来生成这些组合(一些位操作技术类似于bit twiddling hacks).
谢谢.
因此,对于以下序列:0001000111000
期望的结果将是:0001000000000
我完全清楚这可以通过使用汇编BSRL(或类似的bit-twiddling hack)找到MSB的索引然后>>将数字移位(索引 - 1),然后<<转换回(索引-1),但是我想知道是否有一个汇编指令或一系列具有更好性能的指令,而不是一个可以做到这一点的笨拙的黑客.
所以我有一个标志枚举
public Enum test
{
test1 = 1,
test2 = 2,
test3 = 4,
etc.
}
Run Code Online (Sandbox Code Playgroud)
如何测试那一位,只设置一位?
我以前100%完成了这个,但是我的思绪不是这样的!
仅使用以下按位运算:!〜&^ | + << >>.
int binarySize(int x) {
}
return ?;
Run Code Online (Sandbox Code Playgroud) 例如:
我有一个输入= 0x5A ( 0101 1010 ).
我想存储前4位或后4位.
bit-manipulation ×10
c ×6
c++ ×3
algorithm ×2
performance ×2
assembly ×1
bitwise-xor ×1
c# ×1
enum-flags ×1
optimization ×1
x86 ×1
xor ×1