属兔的跟什么属相最配| 包装饮用水是什么水| 骨化是什么意思| 巴黎世家是什么| 梦到自己拉大便是什么预兆| 什么是电解水| 腌羊肉串放什么调料| 脚热是什么原因| 化疗和放疗有什么区别| 830是什么意思| 抗环瓜氨酸肽抗体高是什么意思| 脚背肿是什么原因| 便秘喝什么茶最快排便| 85年属什么的生肖| 手会发抖是什么原因| 梦见自己被抢劫了预示什么| 生肖猴和什么生肖相冲| 食管反流吃什么药| 肺门不大是什么意思| 一级军士长什么待遇| 青字五行属什么| 狗皮肤溃烂用什么药| 水瓶座前面是什么星座| ds是什么意思| 脱脂牛奶是什么意思| 一个壳一个心念什么| 油麦菜不能和什么一起吃| 正方形纸能折什么| 天下无不是的父母是什么意思| b驾照能开什么车| 白发越来越多是什么原因造成的| 梦见煤气罐爆炸是什么意思| e抗原阳性是什么意思| 什么时候人流| 头发为什么会掉| 吃饭咬舌头是什么原因| 法本是什么意思| 尿浑浊是什么病的前兆| 上焦火吃什么药最有效| 单核细胞高是什么原因| 什么叫贫血| 高血压吃什么食物最好| 胃胀挂什么科| 绿意盎然是什么意思| 黑枸杞泡水是什么颜色| 产后能吃什么水果| 917是什么星座| 湿疹要注意什么| xn是什么意思| 龙马精神代表什么生肖| 电脑什么时候发明的| 世俗是什么意思| 肌酐高有什么危害| 为什么会一直流鼻涕| 什么是认证| 嗨体是什么| 肾衰竭吃什么好| 小狗感冒吃什么药| 芒种是什么意思| 抓拍是什么意思| 上火耳鸣吃什么药最好| 隐血试验阴性是什么意思| 食少便溏是什么意思| playboy是什么牌子| 变异性哮喘咳嗽吃什么药| 丹毒病是什么原因引起的| 下午五点半是什么时辰| 6月16是什么星座| 急性胃炎吃什么食物好| 7月5号是什么星座| 胃部彩超能检查出什么| 礽是什么意思| 年轻人白头发是什么原因引起的| 为什么肚子总是胀胀的| 狮子属于什么科| 肌筋膜炎吃什么药| 什么是性病| 财评是什么意思| 虱子长什么样子图片| 慢性胃炎能吃什么水果| 为什么会长胎记| 头皮痒用什么止痒最好| 赶的偏旁是什么| 孩子爱啃指甲是什么原因| hpv什么意思| 怀孕从什么时候开始算起| 木耳炒什么好吃| 送女朋友什么礼物| 一吃东西就肚子疼是什么原因| 头晕是什么情况| 肠胃湿热吃什么药好| 什么叫处方药| 豆面是什么| 眼睛肿疼是什么原因引起的| 唐僧取经取的是什么经| 大放厥词是什么意思| 贫血会引起什么症状| 鸡蛋吃多了有什么坏处| 什么是黄油| 1和0是什么意思| 香港有什么东西值得买| 丁香是什么| 全脂牛奶和脱脂牛奶有什么区别| v1是什么意思| 儿童诺如病毒吃什么药| 胃炎胃溃疡吃什么药| 预包装食品指的是什么| 额窦炎吃什么药效果好| rash什么意思| 橄榄枝象征着什么| 头痛是什么原因造成的| 代糖是什么东西| 十指不沾阳春水什么意思| 二氧化硅是什么氧化物| 女频是什么| 口里有异味是什么原因| 6月22什么星座| 兰州市区有什么好玩的地方| 呼吁是什么意思| 做阴超有黄体说明什么| 明月照沟渠是什么意思| 控线是什么意思| 冲鼠煞北是什么意思| 白开水喝多了有什么危害| c代表什么| 开什么店好| 胆囊炎吃什么食物好| 女人大腿内侧黑是什么原因引起的| 头发有什么用处| 心肌缺血吃什么药| 妇科炎症是什么原因引起的| 两鬓斑白是什么意思| 什么叫三本| pb是什么元素| unicorn是什么意思| 辛辣都包括什么| 什么是占有欲| 人为什么要睡觉| 实性结节什么意思| 眼底出血是什么原因| 右手麻是什么原因| 斗米恩升米仇什么意思| 金融数学学什么| 糜烂性脚气用什么药| 高血压吃什么盐| 匿名是什么意思| 例假为什么第一天最疼| 一个立一个羽读什么| 纵隔是什么意思| 脂溢性皮炎用什么药| 乙型肝炎表面抗体高是什么意思| 五行缺水是什么意思| 狗狗咳嗽吃什么药| 糖尿病能吃什么水果| 手掌痒是什么原因| 耳鸣吃什么药好| 经期同房需要注意什么| 3t是什么意思| 机不可失的下一句是什么| 经常腿麻是什么原因| 1964年属什么的| 世界上最软的东西是什么| 岩茶是什么茶类| 石斛长什么样子图片| 腌牛肉放什么调料| 孕早期生气对胎儿有什么影响| 1月21日什么星座| 冰丝和天丝有什么区别| 霖五行属什么| 手指头发红是什么原因| 眼睛红是什么原因引起的| 唐氏筛查临界风险是什么意思| 胆汁反流性胃炎吃什么中成药| 单发房早是什么意思| 太子龙男装什么档次| 手足是什么意思| 梦到黑狗是什么意思| 白虎痣是什么意思| 黑洞到底是什么| 聪明绝顶是什么意思| 男生被口是什么感觉| 脚底脱皮用什么药| 螳螂吃什么| 玉米芯有什么用途| mary是什么意思| 新生儿什么时候上户口| 突然发热是什么原因| 梭织面料是什么面料| 肝血管瘤有什么症状表现| 咳嗽喉咙痒吃什么药| 梦到车坏了是什么意思| 司空见惯的惯是什么意思| 屁股长痘是什么原因| 克罗心是什么意思| 尿特别多是什么原因| 为什么会得前列腺炎| 有何贵干是什么意思| 肌腱是什么组织| 算五行缺什么免费测试| 阿司匹林是什么| 胜字五行属什么| 然五行属什么| 周期是什么| 草字头的字和什么有关| 蜜蜡五行属什么| 喝莓茶对身体有什么好处| 黄金是什么生肖| 打开心扉是什么意思| 什么灯不会亮| 管型偏高说明什么问题| 刻舟求剑的寓意是什么| 口酸吃什么药| 双氧奶是什么| 胃胀疼是什么原因| 肝火旺吃什么食物好| 人生格言是什么| 屁股上长痘是什么原因| 唏嘘什么意思| 复方是什么意思| 肝脾肿大是什么症状| 人大代表是什么| 厌氧菌是什么| 输血前四项检查是什么| 1970属什么| 右腹疼是什么原因| 风寒感冒吃什么消炎药| 排卵期有什么症状表现| 两个山念什么| 喝益生菌有什么好处| 梦见磕头下跪什么意思| 便秘什么原因| 一直打嗝不止是什么原因| 笄礼是什么意思| 悉心栽培什么意思| 吃脆骨有什么好处| 枧水是什么| 口了又一是什么字| 卑劣是什么意思| 原始分是什么意思| 消炎药不能和什么一起吃| 风流倜傥是什么意思| 知柏地黄丸治疗什么病| 三角形为什么具有稳定性| mct是什么| 家的含义是什么| 松鼠尾巴有什么作用| 月黑风高什么意思| ab型rh阳性是什么意思| 英雄本色是什么意思| 大姨妈推迟是什么原因| 三顾茅庐的顾是什么意思| 未加一笔是什么字| 202年属什么生肖| 面色晄白是什么意思| 灰指甲是什么原因引起| 背道而驰是什么意思| naps是什么意思| 阿昔洛韦是什么药| nt和无创有什么区别| 降血脂喝什么茶最好| 附属医院是什么意思| 轴重是什么意思| 白带是什么样子的| 什么的气味| 百度

辽宁东戴河新区党工委委员、管委会副主任刘宝军被查

(Redirected from Bit string)
百度 毕竟是高端品牌的中大型轿车,起始售价超过40万元,标准配置也是普通车的高水平,安全配置方面该有的一样不缺,还有奔驰特色的注意力辅助系统,就是能判断并提示驾驶者是否疲劳驾驶的功能,还有主动式制动辅助系统,也是奔驰特有的预防性安全系统(PRE-SAFE)的一部分,但仅限于车距和碰撞警告、按需调节的制动辅助以及针对前方车辆和横向穿过的行人的自主制动功能。

A bit array (also known as bit map, bit set, bit string, or bit vector) is an array data structure that compactly stores bits. It can be used to implement a simple set data structure. A bit array is effective at exploiting bit-level parallelism in hardware to perform operations quickly. A typical bit array stores kw bits, where w is the number of bits in the unit of storage, such as a byte or word, and k is some nonnegative integer. If w does not divide the number of bits to be stored, some space is wasted due to internal fragmentation.

Definition

edit

A bit array is a mapping from some domain (almost always a range of integers) to values in the set {0, 1}. The values can be interpreted as dark/light, absent/present, locked/unlocked, valid/invalid, et cetera. The point is that there are only two possible values, so they can be stored in one bit. As with other arrays, the access to a single bit can be managed by applying an index to the array. Assuming its size (or length) to be n bits, the array can be used to specify a subset of the domain (e.g. {0, 1, 2, ..., n?1}), where a 1-bit indicates the presence and a 0-bit the absence of a number in the set. This set data structure uses about n/w words of space, where w is the number of bits in each machine word. Whether the least significant bit (of the word) or the most significant bit indicates the smallest-index number is largely irrelevant, but the former tends to be preferred (on little-endian machines).

A finite binary relation may be represented by a bit array called a logical matrix. In the calculus of relations, these arrays are composed with matrix multiplication where the arithmetic is Boolean, and such a composition represents composition of relations.[1]

Basic operations

edit

Although most machines are not able to address individual bits in memory, nor have instructions to manipulate single bits, each bit in a word can be singled out and manipulated using bitwise operations. In particular:

Use OR to set a bit to one:

   11101010 
OR 00000100 
 = 11101110

AND to set a bit to zero:

    11101010
AND 11111101
  = 11101000

AND to determine if a bit is set, by zero-testing:

       11101010                11101010
   AND 00000001            AND 00000010
     = 00000000              = 00000010
(=0 ∴ bit isn't set)     (≠0 ∴ bit is set)

XOR to invert or toggle a bit:

    11101010        11101110
XOR 00000100    XOR 00000100
  = 11101110      = 11101010

NOT to invert all bits:

NOT 10110010 
  = 01001101

To obtain the bit mask needed for these operations, we can use a bit shift operator to shift the number 1 to the left by the appropriate number of places, as well as bitwise negation if necessary.

Given two bit arrays of the same size representing sets, we can compute their union, intersection, and set-theoretic difference using n/w simple bit operations each (2n/w for difference), as well as the complement of either:

for i from 0 to n/w-1
    complement_a[i]?:= not a[i]
    union[i]       ?:= a[i] or b[i]
    intersection[i]?:= a[i] and b[i]
    difference[i]  ?:= a[i] and (not b[i])

If we wish to iterate through the bits of a bit array, we can do this efficiently using a doubly nested loop that loops through each word, one at a time. Only n/w memory accesses are required:

for i from 0 to n/w-1
    index?:= 0    // if needed
    word?:= a[i]
    for b from 0 to w-1
        value?:= word and 1 ≠ 0
        word?:= word shift right 1
        // do something with value
        index?:= index + 1    // if needed

Both of these code samples exhibit ideal locality of reference, which will subsequently receive large performance boost from a data cache. If a cache line is k words, only about n/wk cache misses will occur.

More complex operations

edit

As with character strings it is straightforward to define length, substring, lexicographical compare, concatenation, reverse operations. The implementation of some of these operations is sensitive to endianness.

Population / Hamming weight

edit

If we wish to find the number of 1 bits in a bit array, sometimes called the population count or Hamming weight, there are efficient branch-free algorithms that can compute the number of bits in a word using a series of simple bit operations. We simply run such an algorithm on each word and keep a running total. Counting zeros is similar. See the Hamming weight article for examples of an efficient implementation.

Inversion

edit

Vertical flipping of a one-bit-per-pixel image, or some FFT algorithms, requires flipping the bits of individual words (so b31 b30 ... b0 becomes b0 ... b30 b31). When this operation is not available on the processor, it's still possible to proceed by successive passes, in this example on 32 bits:

exchange two 16-bit halfwords
exchange bytes by pairs (0xddccbbaa -> 0xccddaabb)
...
swap bits by pairs
swap bits (b31 b30 ... b1 b0 -> b30 b31 ... b0 b1)

The last operation can be written ((x&0x55555555) << 1) | (x&0xaaaaaaaa) >> 1)).

Find first one

edit

The find first set or find first one operation identifies the index or position of the 1-bit with the smallest index in an array, and has widespread hardware support (for arrays not larger than a word) and efficient algorithms for its computation. When a priority queue is stored in a bit array, find first one can be used to identify the highest priority element in the queue. To expand a word-size find first one to longer arrays, one can find the first nonzero word and then run find first one on that word. The related operations find first zero, count leading zeros, count leading ones, count trailing zeros, count trailing ones, and log base 2 (see find first set) can also be extended to a bit array in a straightforward manner.

Compression

edit

A bit array is the most dense storage for "random" bits, that is, where each bit is equally likely to be 0 or 1, and each one is independent. But most data are not random, so it may be possible to store it more compactly. For example, the data of a typical fax image is not random and can be compressed. Run-length encoding is commonly used to compress these long streams. However, most compressed data formats are not so easy to access randomly; also by compressing bit arrays too aggressively we run the risk of losing the benefits due to bit-level parallelism (vectorization). Thus, instead of compressing bit arrays as streams of bits, we might compress them as streams of bytes or words (see Bitmap index (compression)).

Advantages and disadvantages

edit

Bit arrays, despite their simplicity, have a number of marked advantages over other data structures for the same problems:

  • They are extremely compact; no other data structures can store n independent pieces of data in n/w words.
  • They allow small arrays of bits to be stored and manipulated in the register set for long periods of time with no memory accesses.
  • Because of their ability to exploit bit-level parallelism, limit memory access, and maximally use the data cache, they often outperform many other data structures on practical data sets, even those that are more asymptotically efficient.

However, bit arrays are not the solution to everything. In particular:

  • Without compression, they are wasteful set data structures for sparse sets (those with few elements compared to their range) in both time and space. For such applications, compressed bit arrays, Judy arrays, tries, or even Bloom filters should be considered instead.
  • Accessing individual elements can be expensive and difficult to express in some languages. If random access is more common than sequential and the array is relatively small, a byte array may be preferable on a machine with byte addressing. A word array, however, is probably not justified due to the huge space overhead and additional cache misses it causes, unless the machine only has word addressing.

Applications

edit

Because of their compactness, bit arrays have a number of applications in areas where space or efficiency is at a premium. Most commonly, they are used to represent a simple group of Boolean flags or an ordered sequence of Boolean values.

Bit arrays are used for priority queues, where the bit at index k is set if and only if k is in the queue; this data structure is used, for example, by the Linux kernel, and benefits strongly from a find-first-zero operation in hardware.

Bit arrays can be used for the allocation of memory pages, inodes, disk sectors, etc. In such cases, the term bitmap may be used. However, this term is frequently used to refer to raster images, which may use multiple bits per pixel.

Another application of bit arrays is the Bloom filter, a probabilistic set data structure that can store large sets in a small space in exchange for a small probability of error. It is also possible to build probabilistic hash tables based on bit arrays that accept either false positives or false negatives.

Bit arrays and the operations on them are also important for constructing succinct data structures, which use close to the minimum possible space. In this context, operations like finding the nth 1 bit or counting the number of 1 bits up to a certain position become important.

Bit arrays are also a useful abstraction for examining streams of compressed data, which often contain elements that occupy portions of bytes or are not byte-aligned. For example, the compressed Huffman coding representation of a single 8-bit character can be anywhere from 1 to 255 bits long.

In information retrieval, bit arrays are a good representation for the posting lists of very frequent terms. If we compute the gaps between adjacent values in a list of strictly increasing integers and encode them using unary coding, the result is a bit array with a 1 bit in the nth position if and only if n is in the list. The implied probability of a gap of n is 1/2n. This is also the special case of Golomb coding where the parameter M is 1; this parameter is only normally selected when ?log(2 ? p) / log(1 ? p) ≤ 1, or roughly the term occurs in at least 38% of documents.

Examples

edit

Given a big file of IPv4 addresses (more than 100 GB) — we need to count unique addresses. If we use generic map[string]bool — we will need more than 64 GB of RAM, so lets use the bit map, in Go:

package main

import (
	"bufio"
	"fmt"
	"math/bits"
	"os"
)

// bitsetSize is the number of bytes needed for 2^32 bits (512 MiB)
const bitsetSize = 1 << 29

func main() {
	file, err := os.Open("ip_addresses")
	if err != nil {
		fmt.Println("Error opening file:", err)
		return
	}
	defer file.Close()

	bitset := [bitsetSize]byte{}

	// Use a buffered scanner with a larger buffer
	scanner := bufio.NewScanner(file)
	const maxBuffer = 64 * 1024 // 64 KB buffer
	buf := make([]byte, 0, maxBuffer)
	scanner.Buffer(buf, maxBuffer)

	// Process each line
	for scanner.Scan() {
		line := scanner.Bytes()

		// Parse the IP address manually from bytes
		ip := parseIPv4(line)
		// Set the bit
		byteIndex := ip >> 3 // Divide by 8
		bitIndex := ip & 7   // Bit position 0-7
		bitset[byteIndex] |= 1 << bitIndex
	}

	// Check for scanning errors
	if err := scanner.Err(); err != nil {
		fmt.Println("Error reading file:", err)
		return
	}

	var count uint64
	for i := 0; i < bitsetSize; i++ {
		count += uint64(bits.OnesCount8(bitset[i]))
	}

	fmt.Println("Number of unique IPv4 addresses:", count)
}

func parseIPv4(line []byte) (ip uint32) {
	i := 0

	// Octet 1
	n := uint32(line[i] - '0')
	for i = 1; line[i] != '.'; i++ {
		n = n*10 + uint32(line[i]-'0')
	}
	ip |= n << 24
	i++ // Skip the dot

	// Octet 2
	n = uint32(line[i] - '0')
	i++
	for ; line[i] != '.'; i++ {
		n = n*10 + uint32(line[i]-'0')
	}
	ip |= n << 16
	i++ // Skip the dot

	// Octet 3
	n = uint32(line[i] - '0')
	i++
	for ; line[i] != '.'; i++ {
		n = n*10 + uint32(line[i]-'0')
	}
	ip |= n << 8
	i++ // Skip the dot

	// Octet 4
	n = uint32(line[i] - '0')
	i++
	for ; i < len(line); i++ {
		n = n*10 + uint32(line[i]-'0')
	}
	ip |= n

	return ip
}

Language support

edit

The APL programming language fully supports bit arrays of arbitrary shape and size as a Boolean datatype distinct from integers. All major implementations (Dyalog APL, APL2, APL Next, NARS2000, Gnu APL, etc.) pack the bits densely into whatever size the machine word is. Bits may be accessed individually via the usual indexing notation (A[3]) as well as through all of the usual primitive functions and operators where they are often operated on using a special case algorithm such as summing the bits via a table lookup of bytes.

The C programming language's bit fields, pseudo-objects found in structs with size equal to some number of bits, are in fact small bit arrays; they are limited in that they cannot span words. Although they give a convenient syntax, the bits are still accessed using bytewise operators on most machines, and they can only be defined statically (like C's static arrays, their sizes are fixed at compile-time). It is also a common idiom for C programmers to use words as small bit arrays and access bits of them using bit operators. A widely available header file included in the X11 system, xtrapbits.h, is “a portable way for systems to define bit field manipulation of arrays of bits.” A more explanatory description of aforementioned approach can be found in the comp.lang.c faq.

In C++, although individual bools typically occupy the same space as a byte or an integer, the STL type vector<bool> is a partial template specialization in which bits are packed as a space efficiency optimization. Since bytes (and not bits) are the smallest addressable unit in C++, the [] operator does not return a reference to an element, but instead returns a proxy reference. This might seem a minor point, but it means that vector<bool> is not a standard STL container, which is why the use of vector<bool> is generally discouraged. Another unique STL class, bitset,[2] creates a vector of bits fixed at a particular size at compile-time, and in its interface and syntax more resembles the idiomatic use of words as bit sets by C programmers. It also has some additional power, such as the ability to efficiently count the number of bits that are set. The Boost C++ Libraries provide a dynamic_bitset class[3] whose size is specified at run-time.

The D programming language provides bit arrays in its standard library, Phobos, in std.bitmanip. As in C++, the [] operator does not return a reference, since individual bits are not directly addressable on most hardware, but instead returns a bool.

In Java, the class BitSet creates a bit array that is then manipulated with functions named after bitwise operators familiar to C programmers. Unlike the bitset in C++, the Java BitSet does not have a "size" state (it has an effectively infinite size, initialized with 0 bits); a bit can be set or tested at any index. In addition, there is a class EnumSet, which represents a Set of values of an enumerated type internally as a bit vector, as a safer alternative to bit fields.

The .NET Framework supplies a BitArray collection class. It stores bits using an array of type int (each element in the array usually represents 32 bits).[4] The class supports random access and bitwise operators, can be iterated over, and its Length property can be changed to grow or truncate it.

Although Standard ML has no support for bit arrays, Standard ML of New Jersey has an extension, the BitArray structure, in its SML/NJ Library. It is not fixed in size and supports set operations and bit operations, including, unusually, shift operations.

Haskell likewise currently lacks standard support for bitwise operations, but both GHC and Hugs provide a Data.Bits module with assorted bitwise functions and operators, including shift and rotate operations and an "unboxed" array over Boolean values may be used to model a Bit array, although this lacks support from the former module.

In Perl, strings can be used as expandable bit arrays. They can be manipulated using the usual bitwise operators (~ | & ^),[5] and individual bits can be tested and set using the vec function.[6]

In Ruby, you can access (but not set) a bit of an integer (Fixnum or Bignum) using the bracket operator ([]), as if it were an array of bits.

Apple's Core Foundation library contains CFBitVector and CFMutableBitVector structures.

PL/I supports arrays of bit strings of arbitrary length, which may be either fixed-length or varying. The array elements may be aligned— each element begins on a byte or word boundary— or unaligned— elements immediately follow each other with no padding.

PL/pgSQL and PostgreSQL's SQL support bit strings as native type. There are two SQL bit types: bit(n) and bit varying(n), where n is a positive integer.[7]

Hardware description languages such as VHDL, Verilog, and SystemVerilog natively support bit vectors as these are used to model storage elements like flip-flops, hardware busses and hardware signals in general. In hardware verification languages such as OpenVera, e and SystemVerilog, bit vectors are used to sample values from the hardware models, and to represent data that is transferred to hardware during simulations.

Common Lisp provides multi-dimensional bit arrays. A one-dimensional bit-vector implementation is provided as a special case of the built-in array, acting in a dual capacity as a class and a type specifier.[8] Bit arrays (and thus bit vectors) relies on the general make-array function to be configured with an element type of bit, which optionally permits a bit vector to be designated as dynamically resizable. The bit-vector, however, is not infinite in extent. A more restricted simple-bit-vector type exists, which explicitly excludes the dynamic characteristics.[9] Bit vectors are represented as, and can be constructed in a more concise fashion by, the reader macro #*bits.[10] In addition to the general functions applicable to all arrays, dedicated operations exist for bit arrays. Single bits may be accessed and modified using the bit and sbit functions[11] and an extensive number of logical operations is supported.[12]

See also

edit

References

edit
  1. ^ Irving Copilowish (December 1948) "Matrix development of the calculus of relations", Journal of Symbolic Logic 13(4): 193–203 Jstor link
  2. ^ "SGI.com Tech Archive Resources now retired". SGI. 2 January 2018.
  3. ^ "dynamic_bitset<Block, Allocator> - 1.66.0". www.boost.org.
  4. ^ ".NET mscorlib source code". github.com/microsoft. 15 October 2021.
  5. ^ "perlop - perldoc.perl.org". perldoc.perl.org.
  6. ^ "vec - perldoc.perl.org". perldoc.perl.org.
  7. ^ "8.10. Bit String Types". 30 September 2021.
  8. ^ "CLHS: System Class BIT-VECTOR". www.lispworks.com.
  9. ^ "CLHS: Type SIMPLE-BIT-VECTOR". www.lispworks.com.
  10. ^ "CLHS: Section 2.4.8.4". www.lispworks.com.
  11. ^ "CLHS: Accessor BIT, SBIT". www.lispworks.com.
  12. ^ "CLHS: Function BIT-AND, BIT-ANDC1, BIT-ANDC2..." www.lispworks.com.
edit
人中白是什么 经常口腔溃疡吃什么药 大便不成型吃什么药 白萝卜煮水喝有什么功效和作用 煮海带放什么容易烂
左下腹有什么器官 白酒优级和一级有什么区别 田亮为什么不娶郭晶晶 两个a型血的人生的孩子什么血型 盥洗室什么意思
布病是什么 3月12日什么星座 喝水呛咳是什么原因 十八岁属什么生肖 甲状腺密度不均匀是什么意思
新陈代谢是指什么 山莨菪碱为什么叫6542 硒中毒有什么症状 进德勤一般要什么学历 五险一金的一金是什么
四个雷念什么hcv8jop8ns8r.cn speedo是什么牌子xinmaowt.com 05属什么生肖weuuu.com 戒色是什么意思hcv8jop0ns8r.cn 眉毛长痘是什么原因xinjiangjialails.com
眷属是什么意思bfb118.com 为什么吹空调会咳嗽hcv9jop6ns4r.cn 皮肤容易晒黑是什么原因0735v.com 进产房吃什么补充体力hcv9jop4ns1r.cn 三五成群是什么意思hcv9jop8ns1r.cn
磁共振和核磁共振有什么区别hcv9jop7ns3r.cn 安然无恙是什么意思hcv9jop1ns7r.cn 哲是什么意思1949doufunao.com 凶神宜忌是什么意思hcv9jop0ns9r.cn 为什么前壁容易生男孩hcv9jop2ns3r.cn
w是什么意思hcv8jop7ns9r.cn 月经不调吃什么药好hcv9jop4ns6r.cn 镁高有什么症状和危害hcv7jop5ns1r.cn 灵芝有什么作用hcv9jop8ns1r.cn 氧化钠是什么xinjiangjialails.com
百度