现在,我知道设置数字的第i位的方法是使用移位运算符移位1直到达到所需位,然后只是或者数字.但是这个过程是O(数字的长度),因为将数字移到第i个位置就像遍历到那里,对吧?如果我错了,请纠正我.
这是我的代码:
x = x| (1<<i)
Run Code Online (Sandbox Code Playgroud)
有没有办法在O(1)中做到这一点?换句话说,如何直接访问数字中的位?我正在考虑数组索引.
我是电气工程专业的学生.在我们的编程课上,我们获得了大量的C语言练习,并要求解释发生了什么以及IDE如何执行位操作.
因此,例如,如果我给出unsigned short x = 0x000C并执行~x,则输出为65523.您的IDE如何执行此操作?
我用这个代码将4个2位值(无符号字符但它们只保存0-3的值)组合成1个单个无符号字符值
unsigned char nibble = 0;
nibble = (nibble & 0x03) | (output[i] & 0x03);
nibble = (nibble & 0x0C) | (output[i+1] & 0x03) << 2);
nibble = (nibble & 0x30) | (output[i+2] & 0x03) << 4);
nibble = (nibble & 0xC0) | (output[i+3] & 0x03) << 6);
Run Code Online (Sandbox Code Playgroud)
它会为除00 00 00 00之外的所有内容生成不正确的值(它通常会为2个不同的2位值组生成相同的结果).
我很困惑,因为上面的代码是这段代码的编辑,可以很好地将2个4位值组合成1个字节,那么为什么我的版本不能将4个2位值组合成1个字节呢?
char byte;
byte = (byte & 0xF0) | (nibble1 & 0xF); // write low quartet
byte = (byte & 0x0F) | ((nibble2 & 0xF) << …Run Code Online (Sandbox Code Playgroud) 所以我有一个像这样的位域:
unsigned int foobar:1;
Run Code Online (Sandbox Code Playgroud)
然后我使用此代码设置它
uint32_t code = loadCode();
structure.foobar = code & 2;
Run Code Online (Sandbox Code Playgroud)
因此,如果code设置为2,这是否意味着foobar设置为1,0或未定义?我正在使用的确切标准实际上是C++ 11,而不是简单的C.
我正在开展一个个人项目,以提高我对CPU工作方式的了解.所以我正在做一个Intel 8080仿真器,它是一个8位微处理器.
在RRC指令的实现中,其示例如下:
case 0x0f: {
uint8_t x = state->a;
state->a = ((x & 1) << 7) | (x >> 1);
state->cc.cy = (1 == (x&1));
}
Run Code Online (Sandbox Code Playgroud)
我无法理解这条线是如何工作的.
state->a = ((x & 1) << 7) | (x >> 1);
Run Code Online (Sandbox Code Playgroud)
我知道它应该将所有位向右移动1个位置,但我无法弄清楚如何.
如果有人能够为我提供一步一步的实际操作示例,我将不胜感激.
state->a是一个uint8_t模拟名为A的intel 8080寄存器的模拟器.
0x0f 是RRC的HEX值.
这个例子已提供此页.
我一直收到错误说"使用未声明的标识符'a'".据我所知,我声明'a'等于0所以应该设置它.
int numOfBits(short num)
{
for(int a = 0; num; num >> 1){
a += num & 1;
}
return a;
}
Run Code Online (Sandbox Code Playgroud) 因此,在使用Unity时,我必须使用按位运算符.现在,不要误解我,我完全了解按位运算符的用处,并且在某些情况下,如果不必编写一堆丑陋的代码就无法替换它.问题更像是...... a和b之间有什么区别,这里:
double a = 1 << 3;
double b = Math.Pow(2, 3);
Run Code Online (Sandbox Code Playgroud)
根据我对函数和二进制的理解,在这两种情况下,你最终在第四个位置得到1,这等于8 ......什么阻止任何人使用Math.pow而不是按位运算符?它真的会改变什么吗?
所以我是C#的新手,但是我已经想从其他更高级别的语言中得到的一件事就是能够在(接近)C中进行按位操作.我有一堆函数,其中一些或所有参数都是可选的,我喜欢开关,所以我构建了一个函数,将布尔数组转换为无符号的Shorts,这允许我基本上将一个布尔数组Mux为交换机的单个值:
namespace firstAsp.Helpers{
public class argMux{
public static ushort ba2ushort (bool[] parms){
//initialize position and output
ushort result = 0;
int i = parms.Length-1;
foreach (bool b in parms){
if (b)//put a one in byte at position of b
//bitwise or with position
result |= (ushort)(1<<i);
i--;
}
return result;
}
}
}
Run Code Online (Sandbox Code Playgroud)
这是一个示例用例:
public IActionResult Cheese(string fname,string lname)
{
bool[] tf = {fname!=null,lname!=null};
switch(argMux.ba2ushort(tf)){
case 3:
@ViewData["Data"]=$"Hello, {fname} {lname}";
break;
case 2:
@ViewData["Data"]=$"Hello, {fname}";
break;
case 1:
@ViewData["Data"]=$"Hello, Dr. …Run Code Online (Sandbox Code Playgroud) 请考虑我想要检查无符号整数变量中的所有位是否都已设置的代码示例.IntegerType由uint8_t,uint16_t,uint32_t uint64_t取代.
问题:为什么断言成功为IntegerType = uint32_t和uint64_t而uint16_t和uint8_t失败?
#include <cstdint>
#include <cassert>
IntegerType bitset = -1; // set all bits to true
IntegerType t = ~bitset;
bool bAllBitsSet1 = (t == 0);
bool bAllBitsSet2 = ((~bitset) == 0);
assert(bAllBitsSet1 == bAllBitsSet2);
Run Code Online (Sandbox Code Playgroud) 我对|感到困惑 C++中的运算符.我有代码来传输从MCU读取的数据.高8位与低8位分开.并且数据(代码中的BUF)存储补号.所以我用它(BUF[1] << 8) | BUF[0]来获取我的原始数据.但是,结果有点奇怪.例如,现在代码得到d1=-84.如图所示,为什么|操作员不能得到我想要的结果?

#include <cstdlib>
#include <cstdio>
#include <cmath>
#include<iostream>
int main() {
signed char BUF[2];
BUF[0] = -84;
BUF[1] = -2;
short d1;
d1 = (BUF[1] << 8) | BUF[0]; // | operator
std::cout << d1 << std::endl;
std::cin.get();
}
Run Code Online (Sandbox Code Playgroud) bit-manipulation ×10
c ×5
bit ×4
c++ ×4
c# ×2
bit-fields ×1
bit-shift ×1
c++11 ×1
comparison ×1
emulation ×1
intel-8080 ×1
math ×1
multiplexing ×1