我有一个size_t
变量nOffset
,其中包含一些我想知道实际需要多少字节来存储它的变量sizeof(size_t)
。我猜也可以使用MSB的位置?这是我到目前为止的代码(int nLen = 0;
if (nOffset > 0xFFFFFF)
{
nLen = 4;
}
else if (nOffset > 0xFFFF)
{
nLen = 3;
}
else if (nOffset > 0xFF)
{
nLen = 2;
}
else
{
nLen = 1;
}
是4):
Bson newValue = new Document("_id", true);
List<Document> collections = collection.find(newValue).into(new ArrayList<Document>());
答案 0 :(得分:1)
使用循环和预定义常量要容易得多。
将整数除以一个字节的最大值可以表示加一,直到得到零。迭代计数是字节。
以下输出存储整数精度所需的字节数:
size_t a = SIZE_MAX;
size_t bytes = 0;
while( a != 0 )
{
a /= ( 1u << CHAR_BIT );
bytes++;
}
答案 1 :(得分:1)
您可以在GCC
中使用以下内置功能- 内置功能:
int __builtin_clz (unsigned int x)
从最高有效位开始,返回X中前导0位的数量。如果X
为0
,则结果未定义。- 内置功能:
int __builtin_clzl (unsigned long)
与__builtin_clz
类似,但参数类型为unsigned long
。- 内置功能:
int __builtin_clzll (unsigned long long)
与__builtin_clz
类似,但参数类型为unsigned long long
。
在找到前导零的数量之后,简单的计算(num_bits = int
中的位数 - 前导零)来查找所需的位数。您可以更改为(num_bits + 7) / 8
所需的字节数。
答案 2 :(得分:1)
如果您要查找limits.h
变量占用的字节数,可以查看INT_MIN
库,尤其是INT_MAX
和pow(2, N)
常量,然后可以计算字节数。
如果要查找编码某个整数需要多少字节,
使用算法,找到等于或大于整数的2 import java.io.*;
import java.net.*;
import java.security.*;
import java.util.Enumeration;
import javax.net.ssl.*;
public class SSLConnect {
public String MakeSSlCall(String meternum) {
String message = "";
FileWriter file = null;
try {
file = new FileWriter("C:\\SSLCERT\\ClientJavalog.txt");
} catch (Exception ee) {
message = ee.getMessage();
}
//writer = new BufferedWriter(file );
try {
file.write("KeyStore Generated\r\n");
KeyStore keystore = KeyStore.getInstance("JKS");
keystore.load(new FileInputStream("C:\\SSLCERT\\newclientkeystore"), "client".toCharArray());
file.write("KeyStore Generated\r\n");
Enumeration enumeration = keystore.aliases();
while (enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
file.write("alias name: " + alias + "\r\n");
keystore.getCertificate(alias);
file.write(keystore.getCertificate(alias).toString() + "\r\n");
}
TrustManagerFactory tmf =TrustManagerFactory.getInstance("SunX509");
tmf.init(keystore);
file.write("KeyStore Stored\r\n");
SSLContext context = SSLContext.getInstance("SSL");
TrustManager[] trustManagers = tmf.getTrustManagers();
context.init(null, trustManagers, null);
SSLSocketFactory f = context.getSocketFactory();
file.write("About to Connect to Ontech\r\n");
SSLSocket c = (SSLSocket) f.createSocket("192.168.1.16", 4447);
file.write("Connection Established to 196.14.30.33 Port: 8462\r\n");
file.write("About to Start Handshake\r\n");
c.startHandshake();
file.write("Handshake Established\r\n");
file.flush();
file.close();
return "Connection Established";
} catch (Exception e) {
try {
file.write("An Error Occured\r\n");
file.write(e.getMessage() + "\r\n");
file.flush();
file.close();
} catch (Exception eee) {
message = eee.getMessage();
}
return "Connection Failed";
}
}
}
的最小幂,N将是最小位数。这很简单,但当整数为负时有一个小的捕获,请参阅https://softwareengineering.stackexchange.com/questions/239036/how-are-negative-signed-values-stored。
或者尝试打印出数字位并计算它们,请参阅C printing bits。
答案 3 :(得分:0)
简单地遍历从MSB开始的数据,并用0xFF屏蔽每个字节。要知道哪个字节是MSB portabily,你必须使用位移。
在此代码段中,i
是要移位的位数。
size_t i;
for(i=sizeof(data)*8; i!=0; i-=8)
{
if( (data >> (i-8)) & 0xFF)
{
break;
}
}
size_t bytes_to_copy = i / 8;