我有一个包含值历史记录的数组,当添加新值时,我需要将所有先前的值向左移动一个位置,以松开最旧的值并为下一个值腾出空间.
通过使用memmove,我可以想到两种方法:
memmove(&arr[0], &arr[1], sizeof(arr) - sizeof(*arr));
Run Code Online (Sandbox Code Playgroud)
或者通过交换指针:
for (i = 0; i != sizeof(arr) - 1; i++) {
*(arr + i) = *(arr + i + 1);
}
Run Code Online (Sandbox Code Playgroud)
两种方法之间是否存在性能差异,如果不存在,建议使用哪种方法?
谁可以给我解释一下这个?问题是:
sll $t2, $t0, 44
Run Code Online (Sandbox Code Playgroud)
目标是在操作后找到 $t2 的值。初始值为:
$t2 = 0x12345678
$t0 = 0xAAAAAAAA
Run Code Online (Sandbox Code Playgroud)
我知道“sll $t2, $t0, 44”的伪代码翻译是:
t2 = t0 << 44
Run Code Online (Sandbox Code Playgroud)
并且 t0 和 t2 的二进制表示是:
t2 = 10010001101000101011001111000
t0 = 10101010101010101010101010101010
Run Code Online (Sandbox Code Playgroud)
但是如何移位 44 位呢?我认为开始时一个值只有 32 位。如何通过将 $t0 移动 44 位来找到 $t2 的值?
我有一个hex文件,如下所示: -
00000000 AA AA 11 FF EC FF E7 3E FA DA D8 78 39 75 89 4E
00000010 FD FD BF E5 FF DD FF AA E9 78 67 84 90 E4 87 83
00000020 9F E7 80 FD FE 73 75 78 93 47 58 93 EE 33 33 3F
Run Code Online (Sandbox Code Playgroud)
我想读第3和第4个字节.交换这两个字节并将它们保存在变量中.例如,我想在变量"num"中保存0xFF11(在byteswap之后)
这就是我试过的:我逐个读取这两个字节
data=open('xyz.bin','rb').read()
num1=data[2]
num2=data[3]
num1,num2=num2,num1
num= num1*100+num2
print(num)
Run Code Online (Sandbox Code Playgroud)
现在问题是num变量有整数值,我不知道如何获取十六进制.我被困在这里,无法继续前进.任何帮助都会受到欢迎.
PS:我对python很新.
将两个字节打包成一个的最快方法是什么?我有一个很大的字节数组。每个字节代表一个不大于 15 的数字(4 位数字)。因此,我可以将两个字节合并为一个,将第一个字节放入高半字节,将后面的字节放入低半字节。
我目前的方法是创建一个原始数组一半大小的第二个数组,然后迭代原始数组移动它和 | 得到小点心。这有效,但是根据数组的大小需要一段时间。数组从几千个条目到几百万个条目不等。这不是灾难性的,但任何优化都会有所帮助
我试图将2个字节转换为短消息.这2个字节表示无符号短路,而后者又代表端口.我已经尝试了多种方法将这些字节转换为简短的java.但是,我经常无法正确地做到这一点.
这些是我尝试过的方法:
byte a = 0x17;
byte b = 0xCC;
(short)((a << 8) | b);
(short)(((short)a << 8) | b);
Run Code Online (Sandbox Code Playgroud)
结果是0xFFCC,但应该是0x17CC.
在java中,我们可以使用String的方法:byte [] getBytes(Charset charset).此方法使用给定的字符集将String编码为字节序列,并将结果存储到新的字节数组中.
但是如何在GO中做到这一点?Go中有没有类似的方法可以做到这一点?
请让我知道.
我正在使用Java。我想知道为什么Java会产生此输出。我在这里分享代码。
public class vvn {
public static void main(String[] args)
{
byte [] arr = new byte[4];
arr[0] = (byte)157;
arr[1] = 1;
arr[2] = 0;
arr[3] = 0;
System.out.format("read 0x%x 0x%x 0x%x 0x%x \n",arr[3],arr[2],arr[1],arr[0]);
int v = (arr[0] | (arr[1] << 8) | (arr[2] << 16) | (arr[3] << 24));
System.out.format("read 0x%x\n",v);
}
}
Run Code Online (Sandbox Code Playgroud)
我得到的输出为
read 0x0 0x0 0x1 0x9d
read 0xffffff9d
Run Code Online (Sandbox Code Playgroud)
我预计输出应为0x0000019d
我试图从7字节数组中提取前49位.我使用掩码和位移来接近这个字节,如下所示:
long byteVal = ((decryptedVCW[6] & 0xff)&((decryptedVCW[6] & 0xff)<<7)) | ((decryptedVCW[5] & 0xff) << 8) | ((decryptedVCW[4] & 0xff) << 16) | ((decryptedVCW[3] & 0xff) << 24) | ((decryptedVCW[2] & 0xff) << 32) | ((decryptedVCW[1] & 0xff) << 40) | ((decryptedVCW[0] & 0xff) << 48);
其中decryptedVCW是56位字节数组.
屏蔽和位移正如预期的那样工作,直到32位移位"<< 32".
例如,decryptedVCW的十六进制是E865037A9C6424,其中二进制是:
11101000011001010000001101111010100111000110010000100100
当我执行上述移位时,我得到了二进制的7AFC6503:
1111010111111000110010100000011
有没有人知道为什么位移在32位以上崩溃以及如何解决这个问题?
非常感谢Shiv
我想理解下面的代码。第三条线正在做什么转变?
number = 1.265
bits = 8
shifted_no = 1.265 * (2** bits)
Run Code Online (Sandbox Code Playgroud)
如果我检查 number 和shifted_no 结果的二进制格式:
0011 1111 1010 0001 1110 1011 1000 0101
0100 0001 0010 0001 1110 1011 1000 0101
Run Code Online (Sandbox Code Playgroud)
谢谢。
我一起去试图得到的值KiB, MiB, ..., ZiB, Yib分别是KibiByte, MebiByte, ..., ZebiByte, YobiByte.
我在Golang的代码是:
package main
import (
"fmt"
)
func main() {
s := []string{"KiB", "MiB", "GiB", "TiB", "PiB", "EiB", "ZiB", "YiB"}
for k,v := range(s) {
fmt.Printf("%s: %v\n", v, 1 << uint64(10 * (k+1)))
}
}
Run Code Online (Sandbox Code Playgroud)
但是,ZiB and YiB溢出的值Go uint64和这就是为什么我有这个输出:
KiB: 1024
MiB: 1048576
GiB: 1073741824
TiB: 1099511627776 // exceeds 1 << 32
PiB: 1125899906842624
EiB: 1152921504606846976
ZiB: 0 // exceeds 1 << 64
YiB: …Run Code Online (Sandbox Code Playgroud) 我是C++编程新手.我正在尝试实现一个代码,通过该代码我可以从6或更多地生成一个整数值individual bytes.
我已经实现了相同的功能,4 bytes并且它正在工作
我的4字节代码:
char *command = "\x42\xa0\x82\xa1\x21\x22";
__int64 value;
value = (__int64)(((unsigned char)command[2] << 24) + ((unsigned char)command[3] << 16) + ((unsigned char)command[4] << 8) + (unsigned char)command[5]);
printf("%x %x %x %x %x",command[2], command[3], command[4], command[5], value);
Run Code Online (Sandbox Code Playgroud)
使用此代码的值value是,82a12122但是当我尝试6字节时,结果是错误的.
代码为6字节:
char *command = "\x42\xa0\x82\xa1\x21\x22";
__int64 value;
value = (__int64)(((unsigned char)command[0] << 40) + ((unsigned char)command[1] << 32) + ((unsigned char)command[2] << 24) + ((unsigned char)command[3] << 16) …Run Code Online (Sandbox Code Playgroud) 我需要实现一个向左循环 int 的最后 10 位的函数。
所以如果 int 有价值
0b 1111 0000 0000 0000 0000 1100 1100 0000
Run Code Online (Sandbox Code Playgroud)
左旋转 2 会给我们
0b 1111 0000 0000 0000 0000 1111 0000 0000
Run Code Online (Sandbox Code Playgroud)
再向左旋转 1 会得到
0b 1111 0000 0000 0000 0000 1110 0000 0001
Run Code Online (Sandbox Code Playgroud)
ptr- 指向我们想要旋转的给定 int 的指针n- 我们想要旋转多少次void leftRotateLast10Digits(int * ptr, int n) {
}
Run Code Online (Sandbox Code Playgroud)
我知道如果我们想旋转整个 int 该怎么做,但我不知道如何只旋转最后 10 位数字。我认为左旋转一个 int,它看起来像下面这样。但我仍然不明白如何只旋转最后 10 位数字。
void leftRotate(int * ptr, int n) {
int DROPPED_MSB;
int INT_BITS = sizeof(int) * 8 …Run Code Online (Sandbox Code Playgroud) 我正在尝试理解以下代码片段:
unsigned char state = portStates[portNumber];
int bitValue = (state >> 7) & 0x1;
Run Code Online (Sandbox Code Playgroud)
它在最不重要的位上做了一个按位AND
state,对吗?如果它返回true(即,该位被设置),则该数字是奇数.否则,它甚至是.我对么?
谢谢